রিসোর্স থেকে ডিসপ্লে নাম অ্যাট্রিবিউট?


160

আমার একটি স্থানীয় অ্যাপ্লিকেশন রয়েছে এবং আমি ভাবছি যে DisplayNameকোনও উত্স থেকে কোনও নির্দিষ্ট মডেলের সম্পত্তি সেট করা সম্ভব কিনা ।

আমি এরকম কিছু করতে চাই:

public class MyModel {
  [Required]
  [DisplayName(Resources.Resources.labelForName)]
  public string name{ get; set; }
}

তবে আমি এটি করতে পারছি না, যেমন সংকলকটি বলেছেন: "একটি অ্যাট্রিবিউট আর্গুমেন্ট অবশ্যই একটি ধ্রুবক প্রকাশ, টাইপফ এক্সপ্রেশন বা কোনও অ্যাট্রিবিউট প্যারামিটার প্রকারের অ্যারে তৈরির প্রকাশ হতে হবে" :(

কোন workaround আছে? আমি ম্যানুয়ালি লেবেলগুলি আউটপুট দিচ্ছি, তবে ভ্যালিডিটার আউটপুটটির জন্য আমার এগুলি দরকার!

উত্তর:


112

একটি কাস্টম বৈশিষ্ট্য লেখার বিষয়ে:

public class LocalizedDisplayNameAttribute: DisplayNameAttribute
{
    public LocalizedDisplayNameAttribute(string resourceId) 
        : base(GetMessageFromResource(resourceId))
    { }

    private static string GetMessageFromResource(string resourceId)
    {
        // TODO: Return the string from the resource file
    }
}

যা এভাবে ব্যবহার করা যেতে পারে:

public class MyModel 
{
    [Required]
    [LocalizedDisplayName("labelForName")]
    public string Name { get; set; }
}

হ্যাঁ, আমি আজ সকালে একই রকম সমাধানে কাজ করেছি এবং এটি সম্ভবও। তারপর আমি এই পোস্টে যা একই পদ্ধতির হয়েছে পাওয়া adamyan.blogspot.com/2010/02/...
Palantir

23
@ গন্ডার তার পোস্ট, এই একের নিচে (সর্বাধিক ভোট সহ), এটি অনেক সুন্দর সমাধান। কেবলমাত্র সেই লোকদের জন্য যারা কেবল স্বীকৃত পোস্টগুলি পড়েছেন
321X

1
এটি প্রকৃতপক্ষে বিভিন্ন অনুবাদ অ্যাক্সেসের জন্য কাজ করে না কারণ এটি সমস্ত ব্যবহারকারীর জন্য একই মান প্রদান করবে যে কোনও বিষয়ই নয়। স্থানীয় ভেরিয়েবলে রিসোর্সিড সঞ্চয় করুন এবং এর পরিবর্তে ডিসপ্লেনাম ওভাররাইড করুন
ফিশার

5
টোডোর জন্য পরামর্শ: রিটার্ন রিসোর্সস ang ল্যাঙ্গুয়েজ. রিসোর্স ম্যানেজ.গেটস্ট্রিং (রিসোর্সআইডি);
লিওনেল সান্চস সিলভা

4
আপনার ব্যবহার করা উচিত: [নীচে বর্ণিত হিসাবে [প্রদর্শন (নাম = "লেবেলফোর্নাম", রিসোর্স টাইপ = টাইপফ (রিসোর্সস.সোর্সেসস))] ...
ফ্র্যাঙ্ক বাউচার

375

আপনি যদি এমভিসি 3 এবং। নেট 4 ব্যবহার করেন তবে আপনি নতুন Displayস্থানটি System.ComponentModel.DataAnnotationsনেমস্পেসে ব্যবহার করতে পারেন । এই বৈশিষ্ট্যটি বিশিষ্টটিকে প্রতিস্থাপন করে DisplayNameএবং স্থানীয়করণ সমর্থন সহ আরও অনেক কার্যকারিতা সরবরাহ করে।

আপনার ক্ষেত্রে, আপনি এটি ব্যবহার করুন:

public class MyModel
{
    [Required]
    [Display(Name = "labelForName", ResourceType = typeof(Resources.Resources))]
    public string name{ get; set; }
}

পার্শ্ব নোট হিসাবে, এই বৈশিষ্ট্যটি ভিতরে App_GlobalResourcesবা সংস্থানগুলির সাথে কাজ করবে না App_LocalResources। এই GlobalResourceProxyGeneratorসংস্থানগুলি ব্যবহার করার জন্য কাস্টম টুল ( ) এর সাথে এটি করতে হবে । পরিবর্তে আপনার রিসোর্স ফাইলটি 'এম্বেডেড রিসোর্স' তে সেট করা আছে তা নিশ্চিত করুন এবং 'রেজএক্সফিলকোডিজেনেটর' কাস্টম সরঞ্জামটি ব্যবহার করুন।

(আরও পাশের নোট হিসাবে, আপনি এমভিসির সাথে App_GlobalResourcesবা ব্যবহার করা উচিত নয় App_LocalResourceswhy কেন বিষয়টি এখানে রয়েছে তা সম্পর্কে আপনি আরও পড়তে পারেন )


এটি এখানে ব্যবহৃত নির্দিষ্ট উদাহরণের জন্য ভাল তবে এটি বেশিরভাগ গতিশীল সম্পত্তি সেটারের জন্য কাজ করবে না যা স্ট্রিং চায়।
কিংডাঙ্গো

1
প্রোডাক্টে মোতায়েনের আগে যখন আমাদের সমস্ত লোকেল আমাদের সাথে থাকে তখন এটি ভাল। তবে আমি যদি ডিবি স্ট্রিংয়ের জন্য ডিবি কল করতে চাই তবে এই ধরণের পদ্ধতির সঠিক নয়। রিসোর্স ফাইলের অসুবিধাটিও হ'ল পরিবর্তনের উপর প্রভাব ফেলতে আবার সংকলন প্রয়োজন, এর অর্থ আপনার ক্লায়েন্টের কাছে অন্য সংস্করণ প্রকাশ করা দরকার। আমি এটিকে খারাপ দৃষ্টিভঙ্গি হিসাবে বলছি না, দয়া করে
এমনটি

কেবল একটি সমস্যা: মডেলটিতে আমাদের রিসোর্সের ধরণটি জানতে হবে। দুটি স্বতন্ত্র প্রকল্পে আমার একটি মডেল ডিএলএল এবং একটি ওয়েবসাইট রয়েছে। আমি মডেলটিতে প্রদর্শনের নামগুলি সেট করতে এবং ওয়েবসাইটে সংস্থান ধরণের সেট করতে সক্ষম হতে চাই ...
কেক

1
পুনরায় ভাগ করুন এবং আপনার প্রকল্পে রিসোর্স ফাইল তৈরি করুন এবং এটি স্বয়ংক্রিয়ভাবে মনে করিয়ে দেবে এবং তারপরে আপনাকে নামটি রিসোর্স ফাইলে স্থানান্তরিত করতে সহায়তা করবে।
anIBMer

14
সি # 6 এর পরিবর্তে Name = "labelForName"আপনি ব্যবহার করতে পারেন Name = nameof(Resources.Resources.labelForName)
উউই কেইম

35

আপনি যদি আপনার রিসোর্স ফাইলটি খুলেন এবং অ্যাক্সেস মডিফায়ারটিকে সর্বজনীন বা অভ্যন্তরীণে পরিবর্তন করেন এটি আপনার সংস্থান ফাইল থেকে এমন একটি শ্রেণি তৈরি করবে যা আপনাকে দৃ strongly়ভাবে টাইপ করা সংস্থান রেফারেন্স তৈরি করতে দেয়।

রিসোর্স ফাইল কোড তৈরির জন্য বিকল্প ption

যার অর্থ আপনি পরিবর্তে এরকম কিছু করতে পারেন (সি # 6.0 ব্যবহার করে)। তারপরে আপনাকে মনে করতে হবে না যে প্রথম নামটি নিম্নতর বা উটযুক্ত হয়েছে। এবং অন্যান্য বৈশিষ্ট্যগুলি সমস্ত রেফারেন্স সন্ধানের সাথে একই উত্সের মানটি ব্যবহার করে কিনা তা আপনি দেখতে পারেন।

[Display(Name = nameof(PropertyNames.FirstName), ResourceType = typeof(PropertyNames))]
public string FirstName { get; set; }

এই উইনফর্মসের সাথে কাজ করবে? আমার একটি ক্লাস রয়েছে যা আমি সংস্থাগুলির থেকে প্রদর্শন টীকা যুক্ত করেছি এবং আমি সম্পত্তিটির নাম পেতে লিংক থেকে getAttributeFrom পদ্ধতি ব্যবহার করেছি তবে এটি স্থানীয়করণটি দেখায় না!
অন্ধকার_কানাইট

2
আপনি কী স্থানীয়করণের পাঠ্য পেতে নামটি বা নামটি ব্যবহার করতে পারেন? গেটনাম ()? .Name এর জন্য ডকুমেন্টেশন বলছে "নাম সম্পত্তিটির মান পেতে এই সম্পত্তিটি ব্যবহার করবেন না instead পরিবর্তে getName পদ্ধতি ব্যবহার করুন।" msdn.microsoft.com/en-us/library/…
টিকল

হ্যাঁ, আমি এটি বুঝতে পেরেছিলাম যে আমাকে getName () ব্যবহার করতে হয়েছিল। ধন্যবাদ
ডার্ক_কানাইট

20

হালনাগাদ:

আমি জানি অনেক দেরি হয়ে গেছে তবে আমি এই আপডেটটি যুক্ত করতে চাই:

আমি কনভেনশনাল মডেল মেটাডেটা সরবরাহকারী ব্যবহার করছি যা ফিল হ্যাকের উপস্থাপিত এটি আরও শক্তিশালী এবং প্রয়োগ করা সহজ এটি দেখুন: কনভেনশনাল মডেলমেটাডেটা প্রোভাইডার


পুরানো উত্তর

আপনি যদি অনেক ধরণের সংস্থান সমর্থন করতে চান এখানে:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private readonly PropertyInfo nameProperty;

    public LocalizedDisplayNameAttribute(string displayNameKey, Type resourceType = null)
        : base(displayNameKey)
    {
        if (resourceType != null)
        {
            nameProperty = resourceType.GetProperty(base.DisplayName,
                                           BindingFlags.Static | BindingFlags.Public);
        }
    }

    public override string DisplayName
    {
        get
        {
            if (nameProperty == null)
            {
                return base.DisplayName;
            }
            return (string)nameProperty.GetValue(nameProperty.DeclaringType, null);
        }
    }
}

তারপরে এটি ব্যবহার করুন:

    [LocalizedDisplayName("Password", typeof(Res.Model.Shared.ModelProperties))]
    public string Password { get; set; }

সম্পূর্ণ স্থানীয়করণ টিউটোরিয়ালটির জন্য এই পৃষ্ঠাটি দেখুন


1
+1 টি। হ্যাকের সমাধানটি এখানে অন্যদের তুলনায় অবশ্যই সবচেয়ে মার্জিত একটি। এটি এএসপি.এনইটি এমভিসিতে কনভেনশন-ভিত্তিক প্রোগ্রামিংয়ের স্ট্যান্ডে খুব ভাল ফিট করে এবং গ্লোবাল.এএসএক্স.সি.এস-এ একটি একক নুগেট-কমান্ড এবং একক কোডের মাধ্যমে সহজেই প্রয়োগ করা হয়।
নীলজোর

11

আমি সম্পদের বৈশিষ্ট্যগুলি বেছে নিয়ে আমার অ্যাপ_গ্লোবালআরসোর্সগুলির সাথে কাজ করে জিন্সের উত্তর পেয়েছি এবং "কাস্টম টুল "টিকে" পাবলিকরেসএক্সফিলকোডিজেনেটর "এ স্যুইচ করে" এম্বেডেড রিসোর্স "এ অ্যাকশন তৈরি করেছি। নীচে গন্ডারদের মন্তব্য পর্যবেক্ষণ করুন।

এখানে চিত্র বর্ণনা লিখুন

একটি যাদুমন্ত্র মত কাজ করে :)


এটি এমন একটি সংস্থান ফাইলে ফলাফল করে যা সংকলিত হবে ঠিক যেমন আপনি অ্যাপ_গ্লোবাল রিসোর্সের বাইরে কোনও সংস্থান ফাইল যুক্ত করেছেন। সুতরাং আপনার সংস্থান ফাইলটি আর "অ্যাপ_গ্লোবাল রিসোর্স" রিসোর্স ফাইল হিসাবে আচরণ করবে না, যা একেবারে ঠিক। তবে আপনার এটি সম্পর্কে সচেতন হওয়া উচিত। সুতরাং আপনার আর অ্যাপ_গ্লোবাল রিসোর্সে রিসোর্স ফাইল রাখার "সুবিধা" নেই " আপনি ঠিক এটি অন্য কোথাও রাখতে পারতেন।
রেনি

5
public class Person
{
    // Before C# 6.0
    [Display(Name = "Age", ResourceType = typeof(Testi18n.Resource))]
    public string Age { get; set; }

    // After C# 6.0
    // [Display(Name = nameof(Resource.Age), ResourceType = typeof(Resource))]
}
  1. বৈশিষ্ট্যের রিসোর্স টাইপ সংজ্ঞায়িত করুন যাতে এটি কোনও সংস্থান অনুসন্ধান করে
  2. সংস্থান কীটির জন্য ব্যবহৃত বৈশিষ্ট্যের নাম নির্ধারণ করুন , সি # 6.0 এর পরে, আপনি nameofকী কোডিংয়ের পরিবর্তে শক্ত টাইপ করা সহায়তার জন্য ব্যবহার করতে পারেন ।

  3. নিয়ামকটিতে বর্তমান থ্রেডের সংস্কৃতি সেট করুন।

Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");

  1. জনসাধারণের কাছে সংস্থানটির অ্যাক্সেসযোগ্যতা সেট করুন

  2. লেবেল প্রদর্শন cshtml ভালো

@Html.DisplayNameFor(model => model.Age)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.