【问题标题】:MVC Html.DisplayNameFor on a complex model复杂模型上的 MVC Html.DisplayNameFor
【发布时间】:2012-08-28 22:15:27
【问题描述】:

我有一个复杂类型的模型,即用户/地址/地址列表

public class User{
public List<Address> Addresses{get;set;}
}

在我的视图中我正在显示这个

<fieldset><legend>@Html.DisplayNameFor(model=>model.Addresses)</legend>
<table>       
<tr>
    <th>
        @Html.DisplayNameFor(m => Model.Addresses.Street)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Addresses.City)
    </th>
<th>
        @Html.DisplayNameFor(model => model.Addresses.State)
    </th>

    </tr>
@foreach (var item in Model.Addresses) {    
<tr>
    <td>
        @Html.DisplayFor(m => item.Street)
    </td>
    <td>
        @Html.DisplayFor(m => item.City)
    </td>
    <td>
        @Html.DisplayFor(m => item.State)
    </td>
</tr>
} 
    </table></fieldset>

DisplayNameFor Street/City/State 不起作用。

在子对象上获取 DisplayNameFor 的正确方法是什么?

TIA J

【问题讨论】:

  • 尝试使用简单的for 循环,而不是foreach
  • 你在做什么@Html.DisplayNameFor(m =&gt; Model.Addresses.Street.First())?我通常只是手动输入标签。
  • 我想对名称使用数据注释。尝试始终将这样的字符串保留在代码之外。

标签: asp.net-mvc-4 razor


【解决方案1】:

我变了

@Html.DisplayNameFor(m => Model.Addresses.Street)

@Html.DisplayNameFor(m => Model.Addresses.FirstOrDefault().Street)

不要使用@Html.DisplayNameFor(m =&gt; Model.Addresses[0].Street),因为如果您需要编辑第一行,您将无法使用这种方式。

现在一切正常。

【讨论】:

  • 当我尝试使用 [0] 时,它给了我一个运行时错误“无法使用 [] 将索引应用于 'System.Data.Objects.DataClasses.EntityCollection
    ' 类型的表达式”
  • 地址为空怎么办?当 @model 指令被赋予一个 IEnumerable 时,它会计算出来......
【解决方案2】:

您还可以使用 Linq 来避免索引错误。我用这是我的代码 -

@Html.DisplayNameFor(m => Model.Addresses.first().Street)

以下错误消失了。

Cannot apply indexing with [] to an expression of type 'System.Data.Objects.DataClasses.EntityCollection<Address>

不过最好直接用下面的语句来使用Name

@Html.DisplayName("Street")

【讨论】:

    【解决方案3】:

    这可能会更好:

    @Html.DisplayNameFor(m => Model.Addresses.FirstOrDefault().Street)
    

    如果列表为空也可以使用

    【讨论】:

    • 如果列表为空,会不会导致 NRE?
    【解决方案4】:

    要显示地址属性的名称,您可以定义一个空的Adress 模型

    {
      var adress =new Models.Address();
    }
    

    并像这样使用它

     @Html.DisplayNameFor(m => adress.Street)
    

    【讨论】:

      【解决方案5】:

      在 ASP.NET Core 中,可以使用 Html.DisplayNameForInnerType() 代替:

      @Html.DisplayNameForInnerType((Address address) => address.Street)
      

      但是,您需要明确指定 lambda 表达式参数的类型 (Address address)。

      【讨论】:

        【解决方案6】:

        您使用DisplayNameFor 的方式是错误的。 Addresses 是一个列表,它没有 StreetCityState 之类的属性。那么您希望如何显示名称。

        在这种情况下直接使用视图中的名称而不是使用 helper 不是那么简单吗?

        【讨论】:

        • 那么你的解决方案是什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 2012-12-22
        相关资源
        最近更新 更多