MVC3 Razor编辑器/显示模板和泛型

时间:2012-05-16 09:49:52

标签: asp.net-mvc-3 generics razor mvc-editor-templates

关于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 [为MyModel] .cshtml
  • List`1 [[为MyModel]。CSHTML
  • List`1 [MyNamespace.MyModel] .cshtml
  • List`1 [[MyNamespace.MyModel]。CSHTML

如果可能,我想避免编写自定义查找器。如果我不能让上面的东西工作,那么我现在唯一能想到的选择就是让List`1.cshtml调用部分命名,并从List中推断命名。

3 个答案:

答案 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属性,并根据此集合中每个元素的运行时类型选择正确的模板。