Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表中的DisplayNameFor()<;对象>;模型中_C#_Asp.net Mvc_Razor_Model - Fatal编程技术网

C# 列表中的DisplayNameFor()<;对象>;模型中

C# 列表中的DisplayNameFor()<;对象>;模型中,c#,asp.net-mvc,razor,model,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 Lis

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

我的简化模型:

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; } }      
}
现在,我想制作一个表来显示一个人的所有姓名,并获取全名的DisplayName。显然,

@Html.DisplayNameFor(model => model.Names.FullName);
不起作用,而且

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

如果没有名字,就会断开。是否有“最佳方法”在此处获取显示名称?

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

@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)

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

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(); }
    }
}
公共类模型
{
[显示(Name=“A的某个名称”)]
公共int-PropA{get;set;}
[显示(Name=“B的某些名称”)]
公共字符串PropB{get;set;}
}
公共类模型集合
{
公共列表模型{get;set;}
公共模型默认值
{
获取{返回新模型();}
}
}
然后,在视图中:

@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>
@model模型集合
@foreach(Model.Models中的var m)
{
@Html.DisplayNameFor(model=>model.Default.PropA):@m.PropA

@Html.DisplayNameFor(model=>model.Default.PropB):@m.PropB }
我喜欢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; }
    }
}
视图将有一条@model线,如:

@model CustomList<Namespace.Of.PersonNameViewModel.Model>
@model自定义列表

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

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

即使列表为空,它也会工作

我假设如果您没有
列表
而是有一个
IEnumerable
,那么使用表达式
model=>model.Names.First().FullName
也是安全的。这是正确的吗?也就是说,我想我最喜欢三个示例中的
dummyModel
示例。否则,您可能需要在
model.Names[0]中键入或粘贴多个属性。
。然后,也许您应该将该部分重构为一个局部视图,该视图接受
列表
IEnumerable
作为其模型确实适用于空列表。不幸的是,这在IEnumerable属性上不起作用。请注意,
DisplayNameFor
从未实际调用属性的
get
,因此创建实例并不重要。为什么我应该使用此解决方案而不是Tim的解决方案?
@model CustomList<Namespace.Of.PersonNameViewModel.Model>
@Html.DisplayNameFor(x => x.GetEnumerator().Current.ItemName)