我正在嘗試爲索引視圖編寫一個自動腳手架模板。我希望能夠傳入一組模型或視圖模型(例如,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