在DisplayTemplates文件夹中,每个类名只能有一个View,因为类名用作view.cshtml文件的名称。
但是,如果它们出现在不同的名称空间中,则可以在具有相同名称的解决方案中使用两个类:
MyNamespace.Class1
MyOtherNamespace.Class1
两者都尝试使用view:
定义的DisplayTemplateClass1.cshtml
但是在视图文件中,您必须声明模型 - 例如:
@model MyNamespace.Class1
这意味着如果你有一个带有MyOtherNamespace.Class1的DisplayFor,你会因类型不匹配而收到运行时错误。
如果您事先知道将要发生这种情况的地方,您可以使用UIHint强制DisplayFor使用替代模板(或者您可以直接在视图中使用命名模板)。但是,如果你事先不知道(你将所有这些对象都放在某种类型的枚举中,因此无法编写特定的代码来处理这样的边缘情况,而不需要很多笨拙的反思 - 有没有办法让这些类使用DisplayTemplates?
答案 0 :(得分:2)
我之前没有尝试过类似的东西,但它应该有效。您可以让视图接受像object
这样的通用模型类型,然后尝试将其转换为适当的类型:
@model object
@if (Model is MyNamespace.Class1)
{
var class1 = Model as MyNamespace.Class1;
// view code for this type
}
@if (Model is MyOtherNamespace.Class1)
{
var class1 = Model as MyOtherNamespace.Class1;
// view code for this type
}
<强>更新强>
再看一遍,我对这个模板中的分支感到困扰。这是不可避免的,但稍微更好的解决方案可能是这样的:
@model object
@if (Model is MyNamespace.Class1)
{
Html.RenderPartial("MyNamespaceClass1", Model);
}
@if (Model is MyOtherNamespace.Class1)
{
Html.RenderPartial("MyOtherNamespaceClass1", Model);
}
然后,只需创建其他视图即可。这样,您的代码仍然可以整齐地分解为特定的视图,这些视图可以具有适当的模型声明。这个视图基本上只是成为一个路由到正确的代理。