MVC3剃刀编辑/显示模板和泛型(MVC3 Razor Editor/Display templat

2019-09-17 06:38发布

有关于MVC的模板和泛型的一些问题却似乎有没有涉及到什么我要找的。 请考虑以下型号:

namespace MyNamespace
{
    public class ModelBase { /* Not important for example */ }

    public class MyModel : ModelBase
    {
        public string Name { get; set; }
    }

    public class MyViewModel
    {
        public IEnumerable<ModelBase> Data { get; set; }
    }
}

和控制器:

public class HomeController : Controller
{
    public ActionResult Index 
    {
        return View(new MyViewModel { Data = new List<MyModel>() })
    }
}

剃刀视图查看/主页/ Index.cshtml将如下所示:

@model MyNamespace.MyViewModel
@Html.EditorFor(m => m.Data)

没什么特别的存在。 如果我想应该是一个显示或编辑模板,我可以创建在查看/共享/ EditorTemplate或下浏览/首页/ EditorTemplates称为MyModel.cshtml一个文件,并将其正确地找到它。

如果我想要做的事为模型库的每个执行不同的显示列表时? MVC的取景器将在上述任何路径正确找到List'1.cshtml模板。 不过我需要做的是做List`1 [为MyModel] .cshtml模板

我似乎无法得到正确的文件命名。 我已经试过到目前为止(相对于这个例子命名):

  • List`1 [为MyModel] .cshtml
  • List`1 [[为MyModel]。CSHTML
  • List`1 [MyNamespace.MyModel] .cshtml
  • List`1 [[MyNamespace.MyModel]。CSHTML

如果可能的话我想避免编写自定义取景器。 我能想到的,现在,如果我不能得到上面的东西的工作,唯一的选择是只具有List`1.cshtml叫偏从列表命名推断。

Answer 1:

我没有检查这个代码,但我会为每个亚型不同的看法,做喜欢的事,哑巴:

return View(MyModel.GetType().Name, new MyViewModel { Data = new List<MyModel>() })

这样你的视图相匹配的类型的名称。



Answer 2:

一个很迟了回应,有用的,如果在这个同样的问题别人凸点(像我一样几分钟前试图记住如何做到这一点)

您可以使用UIHintAttribute定义编辑器的名称

public class MyViewModel
{
    [UIHint("MyModel")]
    public IEnumerable<ModelBase> Data { get; set; }
}


Answer 3:

你可以在主视图中做到这一点:

@model MyViewModel
@Html.EditorFor(x => x.Data)

然后有:

  • ~/Views/Shared/EditorTemplates/MyModel.cshtml

     @model MyModel ... 
  • ~/Views/Shared/EditorTemplates/MyOtherModel.cshtml (其中明显MyOtherModel从派生ModelBase ):

     @model MyOtherModel ... 

等等... ASP.NET MVC会照顾通过数据属性循环的,并挑选基于运行时类型此集合中的每个元素的正确的模板。



文章来源: MVC3 Razor Editor/Display templates and generics