是否有可能在ASP.NET MVC 3(w/Razor)中使用通用模型?以下語法錯誤會失敗:在ASP.NET MVC中使用通用模型Razor
@model DtoViewModel<T> where T : IDto
是否有可能在ASP.NET MVC 3(w/Razor)中使用通用模型?以下語法錯誤會失敗:在ASP.NET MVC中使用通用模型Razor
@model DtoViewModel<T> where T : IDto
Razor不支持此類語法,對不起。
因爲@model期待一個類型 - 不是一個類型聲明 你可以使用:
@model DtoViewModel<IDto>
,並要在爲了使用泛型類型採取通用的協方差
假設的優勢爲了避免在ViewModel<T>
每個視圖代碼複製,你可以這樣來做:
創造的ViewModel<T>
特有的部分景色到視圖
ModelView.cshtml:
@model ViewModel<specificType>
@{Layout = "~/Views/Shared/Layout.cshtml";}
<h2 class="sub-header">Specific type view</h2>
2.創建公用部分的視圖,即應當在<T>
每個視圖
Grid.cshtml被渲染:
@{ var webGrid = new WebGrid(Model.PageItems); }
<div class="row" style="overflow: auto">
@webGrid.GetHtml("table-striped", mode: WebGridPagerModes.All, firstText: "First", lastText: "Last")
</div>
由於是局部視圖,因此不需要再次聲明Model
的類型。它將簡單地使用您在父視圖中定義的模型來呈現它。您的模型的屬性IList<T> PageItems
將保持與<specificType>
的強類型。
。不要忘記真正使您的公用部分
ModelView.cshtml的局部視圖:
@RenderPage("~/Views/Shared/Grid.cshtml")
這是不理想,但它的工作原理,並能得到這種模式相當有創造性。
@model YourNameSpace.MyModel
public MyModel
{
public MyGenericType<string> ModelAStuff {get;set;}
public MyGenericType<int> ModelBStuff {get;set;}
public MyGenericType<DateTime> ModelCStuff {get;set;}
}
public class MyGenericType<T>
{
//use T how ever you like
public T Color {get;set;}
public T Year {get;set;}
}
無賴。我很樂意在未來看到它的支持,但我沒有看到任何其他人抱怨,所以我懷疑它會獲得任何形式的牽引力。感謝您的回答。 – egoodberry 2011-04-21 12:41:41
我想要這個!所以這是抱怨或至少是另一個人的要求。 – 2011-06-28 16:17:56
哇。說實話,這很令人震驚。 – fearofawhackplanet 2011-09-14 15:27:44