[英]ASP.NET MVC View / Partial with generics
我編寫了一個List`1編輯器模板,用於與EditorFor擴展方法(MVC2)一起使用,但是當使用泛型+空對象時,我遇到了問題。
給定一個模型
class MyModel {
public Foo SomeFoo { get;set; }
public List<Foo> SomeFooList { get;set; }
}
和/Views/Shared/EditorTemplates/List`1.ascx中的模板
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%
IEnumerable enumerableModel;
if (Model != null && (enumerableModel = Model as IEnumerable) != null)
{
foreach (var v in enumerableModel)
{
var model = v;
Response.Write(Html.EditorFor(m => model));
}
}
%>
我得到SomeFoo的預期編輯器,以及SomeFooList的任何非null的元素,因為ModelMetaData中的類型將是“Foo”。 但是,如果我將“null”作為SomeFooList中的一個對象,我得不到任何渲染,因為模型的類型為“object”而不是Foo或更一般來自我的列表的泛型參數。
基本上我想實現類似的東西
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<T>> where T : class" %>
所以我知道我的清單類型。
我還可以看一下在null的情況下更改ModelMetaData.ModelType字段(通過創建一個新對象,因為這是readonly) - 但這是我想避免的那些討厭的黑客之一。
另一個想法是使用.Invoke調用EditorFor方法並將typeof(T)傳遞到那里,但同樣,如果可能的話,我想避免使用這種類型的代碼。
有什么想法嗎?
更新:
試圖將類型轉換為模型元數據看起來比我最初預期的要復雜一些。 我用以下代碼更新了我的代碼似乎有用,但我仍然不太熱衷於solition:
if (Model != null && (enumerableModel = Model as IEnumerable) != null)
{
Type listType = null;
if (enumerableModel.GetType().IsGenericType)
{
listType = enumerableModel.GetType().GetGenericArguments()[0];
}
foreach (var v in enumerableModel)
{
var model = v;
if (model == null && listType != null)
model = Activator.CreateInstance(listType);
Response.Write(Html.EditorFor(m => model));
}
}
阿馬爾
也許您可以考慮創建一個類似於Nullable<T>
的自定義結構來包含您的實體? Nullable<T>
T視為一個結構,這就是為什么你必須創建自己的結構。 這樣,您可以檢查HasValue屬性,而不是檢查null並且不知道類型的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.