Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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# Html.LabelFor是否具有类型和属性名?_C#_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

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()
?还有像