【问题标题】:ASP.NET MVC View / Partial with generics带有泛型的 ASP.NET MVC 视图/部分
【发布时间】:2010-01-07 15:07:23
【问题描述】:

我编写了一个 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 的任何非空元素,因为 ModelMetaData 中的类型将是“Foo”。但是,如果我将“null”作为 SomeFooList 中的对象之一,则我不会得到任何渲染,因为模型的类型是“object”,而不是 Foo 或列表的通用参数中更一般的 T。

基本上我想实现类似的目标

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<T>> where T : class" %>

所以我知道我的清单的类型。

我还可以考虑在 null 的情况下更改 ModelMetaData.ModelType 字段(通过创建一个新对象,因为这是只读的)——但这是我想避免的那些讨厌的黑客行为之一。

另一个想法是使用 .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));
        }
    }

阿马尔

【问题讨论】:

    标签: c# asp.net asp.net-mvc generics generic-list


    【解决方案1】:

    也许您可以考虑创建一个类似于Nullable&lt;T&gt; 的自定义结构来包含您的实体? Nullable&lt;T&gt; 将 T 限制为一个结构,这就是为什么您必须创建自己的结构。这样您就可以检查 HasValue 属性,而不是检查 null 和不知道类型的问题。

    【讨论】:

    • 顺便说一句,如果有人能告诉我如何在这个markdown中正确地编写Nullable而不必输入空格,我会很高兴!
    • 将它包裹在反引号 (`) 中,得到Nullable&lt;T&gt;
    • 这似乎很公平,我明天会玩这个,看看我能不能从中得到什么。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多