簡體   English   中英

ASP.NET MVC View / Partial with generics

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM