我正在尝试为索引视图编写一个自动脚手架模板。我希望能够传入一组模型或视图模型(例如,IQueryable<MyViewModel>
)并获取一个HTML表格,该表格使用DisplayName
属性作为标题(th
元素)和Html.Display(propertyName)
作为单元格(td
元素) 。每一行应该对应于集合中的一个项目。与ASP.NET MVC自动脚手架模板苦苦挣扎
这是我到目前为止有:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%
var items = (IQueryable<TestProj.ViewModels.TestViewModel>)Model;
// How do I make this generic?
var properties = items.First().GetMetadata().Properties
.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm));
%>
<table>
<tr>
<%
foreach(var property in properties)
{
%>
<th>
<%= property.DisplayName %>
</th>
<%
}
%>
</tr>
<%
foreach(var item in items)
{
HtmlHelper itemHtml = ????;
// What should I put in place of "????"?
%>
<tr>
<%
foreach(var property in properties)
{
%>
<td>
<%= itemHtml.Display(property.DisplayName) %>
</td>
<%
}
%>
</tr>
<%
}
%>
</table>
两个问题:
我想它是通用的。所以,我想用
var items = (IQueryable<T>)Model;
代替var items = (IQueryable<TestProj.ViewModels.TestViewModel>)Model;
,或者是这个效果。属性
Html
是在创建视图时为我自动创建的,但是这个HtmlHelper
适用于整个集合。我需要以某种方式创建一个itemHtml
对象,该对象仅适用于foreach
循环中的当前项目。然而,我不确定如何做到这一点,因为HtmlHelper
的构造函数不带Model
对象。
我该如何解决这两个问题?
我会看看MvcContrib网格。谢谢你的提示。至于你的第二个答案,你能给我一些关于如何编写扩展方法的想法吗?我的意思是,我知道如何编写扩展方法,但我不清楚如何使用当前的'item'作为模型创建自己的'HtmlHelper'实例。 – devuxer 2010-03-15 00:52:23
您可以使用property.GetValue(item,null)来获取值。我只是喜欢用一种方法重新包装这种东西。我想它不需要是一个扩展方法。我没有想一秒钟。 – Ryan 2010-03-15 01:22:17
但是'property.GetValue(...)'不等于'Html.Display(...)'。我需要'var itemHtml = ????'之类的东西,然后我会调用'itemHtml.Display(property.DisplayName)'。应该怎么做? – devuxer 2010-03-15 04:50:11