C# Html.LabelFor是否具有类型和属性名?
有没有办法写出这样的东西:C# Html.LabelFor是否具有类型和属性名?,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,有没有办法写出这样的东西: @Html.LabelFor(typeof(StackViewModel), "SomeProperty") 我正在生成一个表(但不能使用@Html.TableFor)并希望使用@Html.LabelFor生成表列标题,但由于该表可能有行,也可能没有行,因此我没有要处理的对象,只有该对象的类型 编辑:为了澄清,我希望使用typeof(),因为我的情况如下: @Html.LabelFor(Model.TableRows.First().Id) 如果“TableRow
@Html.LabelFor(typeof(StackViewModel), "SomeProperty")
我正在生成一个表(但不能使用@Html.TableFor)并希望使用@Html.LabelFor生成表列标题,但由于该表可能有行,也可能没有行,因此我没有要处理的对象,只有该对象的类型
编辑:为了澄清,我希望使用typeof(),因为我的情况如下:
@Html.LabelFor(Model.TableRows.First().Id)
如果“TableRows”没有行,.First()
抛出。@if(Model!=null)
@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>
}
{
@DisplayNameFor(model=>model.Id)
@DisplayNameFor(model=>model.FirstName)
@DisplayNameFor(model=>model.LastName)
@foreach(模型中的var项目)
{
@DisplayFor(modeleItem=>item.Id)
@DisplayFor(modelItem=>item.FirstName)
@DisplayFor(modelItem=>item.LastName)
}
}
或者您可以将的@Html.displayname替换为
@Html.LabelFor
为什么不呢?如果您想使用非通用的
Html
帮助程序并传递类型和属性名,作为一个选项,您可以创建这样的扩展方法:
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
,并且可以对属性使用lambda表达式,如x=>x.Id
,则可以使用@Html.DisplayNameFor(x=>x.Id)
。如果模型
为空或没有行,它也可以工作
因为“@Html.DisplayNameFor(Model.TableRows.First().Id)”如果没有行会崩溃。为什么在使用它之前不检查行的存在?因为即使表没有行,表头也必须有标签。如果表中没有行,我不能完全不显示任何内容。如果您想使用其模型为IEnumerable
类型的通用帮助器,并且您可以为属性使用lambda表达式,@SeM的答案是正确的,您只需要根据需要在呈现行的部分周围放置if语句。如果模型
为空或没有行,它也可以工作。但是,当您想要使用属性名或想要使用非泛型帮助器时,应该像我在回答中所做的那样创建帮助器方法+1在这种情况下,模型既不是集合也不是可枚举的;路径也是Model.TableRows
。为什么不使用FirstOrDefault()
?还有像?