关于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>() })
}
}
Razor视图Views / Home / Index.cshtml看起来像:
@model MyNamespace.MyViewModel
@Html.EditorFor(m => m.Data)
没什么特别的。如果我想要一个显示或编辑器模板,我可以在Views / Shared / EditorTemplate下或在名为MyModel.cshtml的Views / Home / EditorTemplates下创建一个文件,它可以正确找到它。
如果我想在显示列表时为ModelBase的每个实现做些不同的操作怎么办? Mvc视图查找器将在上述任何路径中正确找到List'1.cshtml模板。但是,我需要做的是为List`1 [MyModel] .cshtml
做一个模板我似乎无法获得正确的文件命名。到目前为止我已尝试过(相对于此示例命名):
如果可能,我想避免编写自定义查找器。如果我不能让上面的东西工作,那么我现在唯一能想到的选择就是让List`1.cshtml调用部分命名,并从List中推断命名。
答案 0 :(得分:7)
一个非常晚的回复,如果其他人碰到这个同样的问题很有用(就像我之前做的那样试图记住如何做到这一点)
您可以使用UIHintAttribute来定义编辑器的名称
public class MyViewModel
{
[UIHint("MyModel")]
public IEnumerable<ModelBase> Data { get; set; }
}
答案 1 :(得分:1)
我没有检查过这段代码,但是我会为每个子类型创建不同的视图,并做一些像哑巴一样的事情:
return View(MyModel.GetType().Name, new MyViewModel { Data = new List<MyModel>() })
以便您的视图与您的类型名称匹配。
答案 2 :(得分:0)
您可以在主视图中执行此操作:
@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将负责循环Data属性,并根据此集合中每个元素的运行时类型选择正确的模板。