2013-05-06 53 views
0

希望我在标题中正确地讲了话。基本上,我有一个MVC /实体框架应用程序(代码优先),我可以清楚地看到,已经有迭代发生(从脚手架提供)来编写任何标签,编辑器等。应用程序(Create.cshtml)等迭代通过N模型实例的儿童数量 - 实体框架/ LINQ

我现在需要的是不必为所有标签,editorfor等指定每个属性名称。我需要代码只是寻找对象的每个属性和显示一切,但ID ..

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

p.s.我发现那里有几个问题以某种方式与这个问题有关。但不够接近我要求解决这个问题..

根据视图的数量和没有答案,可能需要一个例子。下面是一个名为Item的类,它有许多属性。每次管理员添加另一个项目时,都会创建一个新实例并设置这些属性。嗯,这很好,很花哨,我只是不想指定什么所有的属性..我想说的东西,像foreach(Item中的属性){Html.DisplayNameFor(Item.PropertyName)},然后再次,在适当的情况下,foreach(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> 

回答

1

在您的物品类别中,您可以通过关闭脚手架隐藏特定的列:在你看来

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

然后,你可以这样做:

@model Item 

@Html.EditorForModel() 

这会自动搜索这些意见:

  • 〜/查看/ {CONTROLLER} /EditorTemplates/Item.cshtml
  • 〜/查看/共享/ EditorTemplates/Item.cshtml
  • (用于.vbhtml其他几个人太)
  • 〜/查看/共享/ 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 
    } 
} 

您可以check here for more documentation什么ViewData.ModelMetadata包含。

+0

不能使用'var'?它会给你一个错误?如果你发布了更多你试过的代码会更好。或者把它放在pastebin.com等东西上作进一步审查。 – Leniency 2013-05-09 14:36:11