Html.LabelFor与Type和属性名称?

时间:2016-03-11 08:53:10

标签: c# asp.net-mvc asp.net-mvc-5

有没有办法写下这样的东西:

@Html.LabelFor(typeof(StackViewModel), "SomeProperty")

我正在生成一个表(但不能使用@ Html.TableFor)并希望使用@ Html.LabelFor来生成表列标题,但由于该表可能有也可能没有任何行,我没有一个可以使用的对象,只是该对象的类型。

编辑:为了澄清,我正在寻找使用typeof(),因为我的情况是这样的:

@Html.LabelFor(Model.TableRows.First().Id)

如果" TableRows"没有行,.First()抛出。

2 个答案:

答案 0 :(得分:2)

如果您想使用非通用Html助手并传递Type和属性名称,您可以选择创建此类扩展方法:

public static MvcHtmlString DisplayNameFor(this HtmlHelper html, 
                                           Type modelType, string expression)
{
    var metadata = ModelMetadataProviders.Current
                      .GetMetadataForProperty(null, modelType, expression);
    return MvcHtmlString.Create(metadata.GetDisplayName());
}

然后你可以这样使用它:

@Html.DisplayNameFor(typeof(Sample.Models.Category), "Id")

注意:

  • 如果需要,您可以增强方法并添加一些验证规则和异常处理。
  • 如果您的模型属于IEnumerable<T>类型且您可以对x=>x.Id等属性使用lambda表达式,则可以使用@Html.DisplayNameFor(x=>x.Id)。如果Model为null或没有行,它也可以工作。

答案 1 :(得分:1)

@if(Model != null)
{
    <table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Id)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.FirstName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LastName)
        </th> 
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelitem => item.Id)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
        </tr>
    }
</table>
}

或者您可以将@Html.DisplayNameFor替换为@Html.LabelFor

为什么不呢?