DisplayNameFor()来自Model </object>中的List <object>

时间:2013-12-27 21:10:29

标签: c# asp.net-mvc razor model

我相信这很简单,我似乎无法找到正确的方法来显示模型中列表中的项目的显示名称。

我的简化模型:

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; }
}

现在,我想创建一个表来显示一个人的所有名称,并获取DisplayNameFor FullName。显然,

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

无效,

@Html.DisplayNameFor(model => model.Names[0].FullName);  
如果没有名字,

将会中断。是否有“最好的方法”来获取显示名称?

4 个答案:

答案 0 :(得分:122)

这实际上有效,即使没有列表中的项目:

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

它的工作原理是因为MVC解析表达式而不是实际执行它。这使得它可以找到正确的属性和属性,而无需在列表中有一个元素。

值得注意的是,甚至不需要使用上面的参数(model)。这也有效:

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

就像这样:

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

答案 1 :(得分:3)

还有另一种方法,我想这更清楚:

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>

答案 2 :(得分:2)

作为替代解决方案,您可以尝试:

for (int i = 0; i < arr.length; i++) {
     System.out.println(diff(arr[]);
}

即使列表为空也可以使用!

答案 3 :(得分:1)

我喜欢T-moty的解决方案。我需要使用泛型的解决方案,所以我的解决方案基本上是这样的:

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; }
    }
}

在视图中使用它与他的示例相同。我创建了一个空对象的单个实例,所以每次引用 Default 时我都不会创建新实例。

注意,需要 new()约束才能调用 new T()。如果你的模型类没有默认的构造函数,或者你需要在构造函数中添加参数,你可以使用它:

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

该视图将包含 @model 行,如:

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