【问题标题】:MVC Display Template for multiple models多个模型的 MVC 显示模板
【发布时间】:2014-07-16 08:31:28
【问题描述】:

为了跟上 DRY 原则,我在多个视图中生成了一些 html,我将它移到了显示模板中。

由于不同的视图有不同的模型,我怎样才能使显示模板通用?属性名称相同。

假设我有这两个模型:

public class ListModel
{
 public bool Prop1 {get;set;}
 public bool Prop2 {get;set;}
}

public class DisplayModel 
{
 public bool Prop1 {get;set;}
 public bool Prop2 {get;set;}
}

这是我的显示模板 - 我怎样才能使它更通用 - 我需要它能够接受具有相同属性名称的任何模型?

@model ListModel
{
 if(Model.Prop1)
 {
  <div>Prop1!</div>
 }
 if(Model.Prop2)
 {
  <div>Prop2!</div>
 }

}

这是我的 2 个视图:列表和显示

列表:

@model ListModel

@DisplayFor(@Model, "CustomDisplayTemplate")

显示:

@model DisplayModel

@DisplayFor(@Model, "CustomDisplayTemplate") //will currently break as the custom display template expects a ListModel

【问题讨论】:

  • 你最好有一个基础(抽象)模型类或接口,两个视图模型都从该类或接口继承并以此为模板。

标签: asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

用两个属性创建一个接口:

public interface ISameModel
{
 bool Prop1 { get; }
 bool Prop2 { get; }
}

public class ListModel : ISameModel
{
 public bool Prop1 {get;set;}
 public bool Prop2 {get;set;}
}

public class DisplayModel : ISameModel
{
 public bool Prop1 {get;set;}
 public bool Prop2 {get;set;}
}

然后将此接口用作模板中的模型

@model ISameModel

【讨论】:

  • 谢谢,简单而优雅的解决方案
【解决方案2】:

一种选择是使用UIHint 属性。当这个属性被添加到模型属性时,Razor 会寻找同名的视图模板。

[UIHint("MyCustomView")]
public class ListModel
{

    public bool Prop1 {get;set;}
    public bool Prop2 {get;set;}
}

[UIHint("MyCustomView")]
public class DisplayModel 
{
    public bool Prop1 {get;set;}
    public bool Prop2 {get;set;}
}

你可以把你的自定义视图放在这里Views/DisplayTemplates/MyCustomView.cshtml,注意模型类型现在是动态的:

@model dynamic

@if(Model.Prop1)
{
    <div>Prop1!</div>
}
@if(Model.Prop2)
{
    <div>Prop2!</div>
}

您还可以在 Views/EditorTemplates/MyCustomView.cshtml 此处为编辑器模板添加视图。

【讨论】:

  • 如果您无法更改基类,这是一个方便的选择。在这种情况下,@zahorak 的答案可能更可取,尽管您可以结合使用这两个答案。
猜你喜欢
  • 1970-01-01
  • 2013-02-16
  • 2011-06-08
  • 1970-01-01
  • 2011-05-30
  • 2013-08-27
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多