如何处理具有相同名称的两个类的MVC DisplayTemplates(不同的命名空间)

时间:2017-08-15 15:02:27

标签: c# asp.net-mvc

在DisplayTemplates文件夹中,每个类名只能有一个View,因为类名用作view.cshtml文件的名称。

但是,如果它们出现在不同的名称空间中,则可以在具有相同名称的解决方案中使用两个类:

MyNamespace.Class1
MyOtherNamespace.Class1

两者都尝试使用view:

定义的DisplayTemplate
Class1.cshtml

但是在视图文件中,您必须声明模型 - 例如:

@model MyNamespace.Class1

这意味着如果你有一个带有MyOtherNamespace.Class1的DisplayFor,你会因类型不匹配而收到运行时错误。

如果您事先知道将要发生这种情况的地方,您可以使用UIHint强制DisplayFor使用替代模板(或者您可以直接在视图中使用命名模板)。但是,如果你事先不知道(你将所有这些对象都放在某种类型的枚举中,因此无法编写特定的代码来处理这样的边缘情况,而不需要很多笨拙的反思 - 有没有办法让这些类使用DisplayTemplates?

1 个答案:

答案 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);
}

然后,只需创建其他视图即可。这样,您的代码仍然可以整齐地分解为特定的视图,这些视图可以具有适当的模型声明。这个视图基本上只是成为一个路由到正确的代理。