【问题标题】:ASP.NET MVC Display Template for Generic Type通用类型的 ASP.NET MVC 显示模板
【发布时间】:2011-05-30 17:40:41
【问题描述】:

我正在尝试将模型 ListModel 用作通用列表模型。我想进入页面

@Html.DisplayForModel()

然而,MVC 没有正确找到模板文件“ListModel.cshtml”。对于通用模型,它必须以不同的方式工作。我应该为模板文件命名以使其正确定位?

public class ListModel<T>
{
public IEnumerable<T> Models { get; set; }
public string NextPage { get; set; }
}

我希望它会寻找Shared/DisplayTemplates/ListModel.ascx,但它没有。有人知道吗?

编辑:

我确实通过像这样简单地删除通用参数来解决这个问题。我确实想知道您是否仍然可以使用通用文件名。

public class ListModel
{
    public IEnumerable Models {get;set;}
    public string NextPage {get;set;}
}

【问题讨论】:

  • 我不明白你要做什么,你能再解释一下吗?
  • 可以使用模板名称帮助的 DisplayForModel 重载吗?

标签: c# .net asp.net asp.net-mvc asp.net-mvc-2


【解决方案1】:

您可以显式指定您的模板,然后 MVC 会照常找到它。

@Html.DisplayForModel("ListModel")

类似

@Html.DisplayFor(m=>m.AProperty,"TemplateName")

【讨论】:

    【解决方案2】:

    作为一种解决方法,您能否使用UIHint 属性装饰ListModel&lt;T&gt; 类以强制它使用您想要的模板?

    例如,

    [UIHint("ListModel")]
    public class ListModel<T>
    {
    ...
    

    【讨论】:

    • UIHint 属性不能应用于这样的类,只能应用于属性和字段。
    • @Darren,真可惜 :) 这本来是完美的
    【解决方案3】:

    我认为这是不可能的。

    想一想:如果您能够以某种方式将模板声明为泛型(例如通过调用 ListModel`1.ascx 或其他名称),MVC 运行时将如何处理模型的任何特定实例?以及如何在模板中显示通用属性/字段?

    我无法找到 MS 明确声明不允许使用通用模型的地方,但我看不出它们将如何使其工作。

    观察结果也支持这一点,即如果您尝试创建强类型视图,则泛型类会从下拉框中过滤掉。

    【讨论】:

    • 它无法通过逆变和动态类型来决定如何处理这些属性。
    • 它可以将其他 DisplayTemplate/EditorTemplate 用于泛型类型的实例,就像您可以使用 Object.cshtml 模板呈现任何类型一样。如果您能够提供用于呈现项目集合的模板,这将非常有用,例如TableListView IconsView MasterDetailsView 等等。但我仍然同意目前这是不可能的。然而,这是一个完全可实施的解决方案。
    猜你喜欢
    • 2011-07-14
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多