মডেলটিতে << বিষয়> তালিকা থেকে ডিসপ্লে নেমফোর্ড () From


88

আমি বিশ্বাস করি এটি বেশ সহজ, আমি আমার মডেলটির মধ্যে থাকা কোনও তালিকার মধ্যে কোনও আইটেমের প্রদর্শনের নামটি দেখানোর সঠিক উপায় খুঁজে পাচ্ছি না।

আমার সরলীকৃত মডেল:

public class PersonViewModel
{
    public long ID { get; set; }

    private List<PersonNameViewModel> names = new List<PersonNameViewModel>();

    [Display(Name = "Names")]
    public List<PersonNameViewModel> Names { get { return names; } set { names = value; } }      
}

এবং নাম:

public class PersonNameViewModel
{
    public long ID { get; set; }

    [Display(Name = "Set Primary")]
    public bool IsPrimary { get; set; }

    [Display(Name = "Full Name")]
    public string FullName { get; set; }
}

এখন আমি কোনও ব্যক্তির সমস্ত নাম দেখানোর জন্য একটি টেবিল তৈরি করতে চাই এবং ফুল নেমটির জন্য প্রদর্শনের নামটি পাই। স্পষ্টতই,

@Html.DisplayNameFor(model => model.Names.FullName);

কাজ করবে না, এবং

@Html.DisplayNameFor(model => model.Names[0].FullName);  

নাম না থাকলে ভেঙে যাবে এখানে প্রদর্শনের নামটি পাওয়ার জন্য কি কোনও 'সেরা উপায়' রয়েছে?

উত্তর:


144

তালিকার আইটেম ছাড়াই এটি কাজ করে:

@Html.DisplayNameFor(model => model.Names[0].FullName)

এটি কাজ করে কারণ এমভিসি প্রকৃতপক্ষে এটি কার্যকর করার পরিবর্তে এক্সপ্রেশনটিকে পার্স করে। এটি এটিকে তালিকার একটি উপাদান থাকার প্রয়োজন ছাড়াই সঠিক সম্পত্তি এবং বৈশিষ্ট্যটি সন্ধান করতে দেয়।

এটি লক্ষণীয় যে প্যারামিটার ( modelউপরে) এমনকি ব্যবহার করার প্রয়োজন নেই। এটিও কাজ করে:

@Html.DisplayNameFor(dummy => Model.Names[0].FullName)

এটি যেমন করে:

@{ Namespace.Of.PersonNameViewModel dummyModel = null; }
@Html.DisplayNameFor(dummyParam => dummyModel.FullName)

আমি অভিমানী করছি যে, যদি এর পরিবর্তে List<PersonNameViewModel>আপনি একটি আছে IEnumerable<PersonNameViewModel>, তাহলে এটি আরো নিরাপদ অভিব্যক্তি ব্যবহার করবেন তা model => model.Names.First().FullName। এটা কি সঠিক? এটি বলেছিল, আমি মনে করি আমি dummyModelতিনটির মধ্যে সেরাটি পছন্দ করি । অন্যথায়, আপনার বেশ কয়েকটি বৈশিষ্ট্য থাকতে পারে যেখানে আপনাকে টাইপ করতে বা আটকানো দরকার model.Names[0].। তারপরে আবার, সম্ভবত আপনার বিভাগটিকে একটি আংশিক দৃশ্যে রিফ্যাক্টর করা উচিত যা গ্রহণ করে Listবা IEnumerableএর মডেল হিসাবে।
অ্যানটোয়াইন

6
আমি পরীক্ষা করেছি এবং FirstOrDefault()খালি তালিকা দিয়ে কাজ করি ।
জোশ কে

দুর্ভাগ্যক্রমে এটি আইনামেবল সম্পত্তি নিয়ে কাজ করে না।
উইলি ডেভিড জুনিয়র

7

এটি করার জন্য আরও একটি উপায় রয়েছে এবং আমার ধারণা এটি আরও স্পষ্ট:

public class Model
{
    [Display(Name = "Some Name for A")]
    public int PropA { get; set; }

    [Display(Name = "Some Name for B")]
    public string PropB { get; set; }
}

public class ModelCollection
{
    public List<Model> Models { get; set; }

    public Model Default
    {
        get { return new Model(); }
    }
}

এবং তারপরে, এই দৃষ্টিতে:

@model ModelCollection

<div class="list">
    @foreach (var m in Model.Models)
    {
        <div class="item">
            @Html.DisplayNameFor(model => model.Default.PropA): @m.PropA
            <br />
            @Html.DisplayNameFor(model => model.Default.PropB): @m.PropB
        </div>
    }
</div>

3

বিকল্প সমাধান হিসাবে আপনি চেষ্টা করতে পারেন:

@Html.DisplayNameFor(x => x.GetEnumerator().Current.ItemName)

তালিকা খালি থাকলেও চলবে!


টিম এস এর সমাধানের পরিবর্তে কেন আমি এই সমাধানটি ব্যবহার করব?
একনাদিল্লি

1

আমি টি-মোটির সমাধানটি পছন্দ করি। জেনেরিকগুলি ব্যবহার করে আমার একটি সমাধানের প্রয়োজন ছিল তাই আমার সমাধানটি মূলত এটি:

public class CustomList<T> : List<T> where T : new()
{       
    public static async Task<CustomList<T>> CreateAsync(IQueryable<T> source)
    {           
        return new CustomList<T>(List<T> list); //do whatever you need in the contructor, constructor omitted
    }

    private T defaultInstance = new T();

    public T Default
    {
        get { return defaultInstance; }
    }
}

দৃষ্টিতে এটি ব্যবহার করা তার উদাহরণের মতো। আমি একটি খালি অবজেক্টের একক উদাহরণ তৈরি করি তাই প্রতিবার আমি যখন ডিফল্ট উল্লেখ করি তখন কোনও নতুন উদাহরণ তৈরি করি না ।

দ্রষ্টব্য, নতুন টি () কল করতে নতুন () সীমাবদ্ধতার প্রয়োজন । যদি আপনার মডেল শ্রেণিতে ডিফল্ট কনট্রাক্টর না থাকে বা আপনার কনস্ট্রাক্টরের সাথে যুক্তি যুক্ত করতে হবে তবে আপনি এটি ব্যবহার করতে পারেন:

private T defaultInstance = (T)Activator.CreateInstance(typeof(T), new object[] { "args" });

ভিউটিতে একটি @ মডেল লাইন থাকবে :

@model CustomList<Namespace.Of.PersonNameViewModel.Model>

নোট করুন যে DisplayNameForপ্রকৃতপক্ষে কখনই getসম্পত্তিটির জন্য কল করে না, তাই আপনি কোনও উদাহরণ তৈরি করলে তাতে কিছু আসে যায় না।
নেটমেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.