2014-01-29 54 views
0

我想用PartialView创建一个通用网格。在哪里我将推出任何模型,它会输出一些html和js,以便我可以重用。但为此,我需要dynamicIEnumerable类型,现在我需要从ViewData.Model获得传递模型的所有属性,因为那是我设置模型的地方。但我找不到具体的解决方案。
有人可以请我指出正确的方向吗?这将是一个很大的帮助。枚举ViewData.Model的所有属性

回答

4

我没有看到需要PartialView我会为此创建一个HTML助手。你的html helper只接受一个简单的object作为模型。在帮助程序中,您可以使用字符串构造表格,然后枚举对象模型的所有属性。

这可以很容易地通过创建一个html helper来完成。

public static class HtmlHelpers 
{ 
    public static IHtmlString ModelTableForm(this HtmlHelper html, object model) 
    { 
     StringBuilder modelTable = new StringBuilder(); 
     modelTable.Append("<table>"); 
     modelTable.AppendFormat("<caption>{0}</caption>", model.GetType().Name); 
     modelTable.Append("<tbody>"); 

     foreach (var property in model.GetType().GetProperties()) 
      modelTable.Append(addModelRow(property.Name, property.GetValue(model, null))); 
     modelTable.Append("</tbody>"); 
     modelTable.Append("</table>"); 
     return html.Raw(modelTable.ToString()); 
    } 

    static string addModelRow(string name, object value) 
    { 
     StringBuilder row = new StringBuilder(); 
     row.Append("<tr>"); 
     row.AppendFormat("<td>{0}</td>", name); 
     row.AppendFormat("<td>{0}</td>", value); 
     row.Append("</tr>"); 
     return row.ToString(); 
    } 
} 

正如你可以看到这个帮手简单地使用字符串构建表,并通过所有属性创建每个属性的行枚举。

接下来是访问您的HTML助手。现在这一切都取决于您创建课程的位置,但可以使用以下语句轻松添加到任何视图:

using <my full html helper namespace;

最后要调用帮助器,你只需要简单地调用@Html对象的html帮助器即可。

@Html.ModelTableForm(Model) 

这将生成一个表(全部 - 它需要更多的样式工作)。作为 enter image description here

我的建议是添加一些风格,也许物业类型检查修改助手是如何显示不同的物业类型。 (如果该属性继承IEnumerable以通过递归枚举所有条目和属性到子表中,则为IE)。

无论如何。希望这可以帮助

+0

谢谢。没有想到这一点。这也可以。但是我的问题仍然是,如果我必须像我在问题中提到的那样做。我仍然会被卡住。 – lbrahim

+1

我个人会在助手上做这个,而不是局部的,因为你的代码会更干净。使用局部属性,你仍然必须编写属性的枚举逻辑,如果你想扩展属性值的显示方式,你可能会发现局部变得非常有意思。 – Nico

+0

谢谢。我认为现在和Helper一起去。真的很感谢你的帮助:)但是为了争辩,如果我使用Helpers,那么我错过了在'PartialView'中获得的格式和语法突出显示。输出字符串作为代码是噩梦。 – lbrahim