3

关于 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 或 Views/Home/EditorTemplates 下创建一个名为 MyModel.cshtml 的文件,它会正确找到它。

如果我想在显示列表时为 ModelBase 的每个实现做一些不同的事情怎么办?Mvc 取景器将在上述任何路径中正确找到 List'1.cshtml 模板。但是我需要做的是为 List`1[MyModel].cshtml 做一个模板

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

  • 列表`1[MyModel].cshtml
  • 列表`1[[MyModel]].cshtml
  • 列表`1[MyNamespace.MyModel].cshtml
  • 列表`1[[MyNamespace.MyModel]].cshtml

如果可能的话,我想避免编写自定义取景器。如果我不能让上面的东西工作,我现在能想到的唯一选择就是让 List`1.cshtml 调用一个从 List 推导出命名的部分。

4

3 回答 3

7

一个很晚的回复,如果其他人遇到同样的问题,这很有用(就像我刚才所做的那样,试图记住如何做到这一点)

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

public class MyViewModel
{
    [UIHint("MyModel")]
    public IEnumerable<ModelBase> Data { get; set; }
}
于 2012-11-08T15:07:20.320 回答
1

我还没有检查过这段代码,但我会为每个子类型创建不同的视图并做一些愚蠢的事情,比如:

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

以便您的 View 与您的类型的名称匹配。

于 2012-05-16T11:11:40.867 回答
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 属性并根据该集合中每个元素的运行时类型选择正确的模板。

于 2012-05-16T12:16:33.270 回答