0

希望我在标题中说对了。基本上,我有一个 MVC/Entity Framework 应用程序(代码优先),我可以清楚地看到已经发生了迭代(从脚手架提供)来编写任何标签、编辑器等。foreach 对象从用户动态创建应用程序(Create.cshtml)等

我现在需要的是不必为所有标签、editorfor 等指定每个属性名称。我需要让代码只查找对象的每个属性并显示除 ID 之外的所有内容。

我想这会很简单。但是,除了脚手架选项的惊人建筑师忽略了这种使用之外,我也没有弄清楚。如果可能的话,我希望使用实体框架(或者我猜查询将是 LINQ,对吗?),lambda 表达式,以其他漂亮代码的方式。

ps 我看到有一些问题在某种程度上与这个问题有关。但与我要求解决此问题的内容还不够接近..

基于视图的数量和没有答案,也许需要一个例子。下面是一个名为 Item 的类,它具有许多属性。每次管理员添加另一个项目时,都会创建一个新实例并设置这些属性。好吧,这很好,花花公子,我只是不想指定所有属性是什么。我想说的是,foreach(property in Item){Html.DisplayNameFor(Item.PropertyName)} 然后再说一次,在适当的情况下, foreach(property in Item){Html.EditorFor(Item.PropertyName)} 这样就可以创建标签和输入框,而无需我指定:“Item.Name, Item.Category, Item.Price, Item .Blah”,然后如果我添加更多属性,我必须再次返回我的代码并添加更多内容......

所以,话虽这么说,这是我的课:

public class Item
{
    public int ID { get; set; }

    [Required]
    public string ItemName { get; set; }

    [DataType(DataType.Date)]
    public DateTime AvailableDate { get; set; }

    [Required]
    public string Category { get; set; }

    [Range(1, 10000000)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }
}

现在这里是我需要动态的地方:

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(foreach(modelProperty in model.Properties)
        {modelProperty.PropertyName}
        </th>
    <tr>
</table>

<table>
     <tr>
        <th>
            @Html.DisplayFor(foreach(modelProperty in model.Properties)
        {modelProperty.PropertyName}
        </th>
</table>
4

2 回答 2

1

这不是DisplayForModel的用途吗?

于 2013-05-06T17:32:06.080 回答
1

在您的项目类上,您可以通过关闭脚手架来隐藏特定列:

public class Item
{
    [ScaffoldColumn(false)]
    public int ID { get; set; }
}

然后在您看来,您可以这样做:

@model Item

@Html.EditorForModel()

这将自动搜索这些视图:

  • ~/Views/{CONTROLLER}/EditorTemplates/Item.cshtml
  • ~/Views/Shared/EditorTemplates/Item.cshtml
  • (其他一些 .vbhtml 也是)
  • ~/Views/Shared/Object.cshtml

如果这些都不存在,它将转到默认对象编辑器。它检查模型元数据以构建表单。模型元数据是通过属性的反射自动构建的。

您正在寻找的内容是对对象属性进行循环,需要更多时间并且需要反射。在你看来,我强烈建议不要这样做——太多的逻辑和视图应该只是简单的模板。

例如,我编写了一个自定义 Object.cshtml 模板来匹配我布局表单的方式。这在 ~/Views/Shared/EditorTemplates/Object.cshtml 中。它将自动遍历所有属性(我省略了几个自定义扩展)

<dl>
    @foreach (var prop in
        ViewData.ModelMetadata.Properties
            .Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm)))
    {
        <dt>@Html.Label(prop.PropertyName)</dt>
        <dd>
            @Html.Editor(prop.PropertyName)
            @Html.ValidationMessage(prop.PropertyName)
        </dd>
    }
</dl>

您会很快发现基本的编辑器模板无法涵盖您需要的所有内容。对于非常基本的形式,是的。复杂的对象,不是那么多。

作为参考,以下是使用反射循环所有属性的方法,但实际上这样做的想法又不好又多余:

@{

    // Not good way, with reflection. Have to check for all the various dataannotations
    // yourself for each property.
    var properties = Model.GetType().GetProperties();

    foreach (var property in properties)
    {
        @property.Name
    }


    // Better way (sort of), loop the data which is already built
    // in the view with metadata properties.
    foreach (var property in ViewData.ModelMetadata.Properties)
    {
        @property.DisplayName
    }
}

您可以在此处查看有关 ViewData.ModelMetadata 包含内容的更多文档。

于 2013-05-06T21:20:41.490 回答