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



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

但是,如果解决方案中有两个类出现在不同的命名空间中,则可以

使它们具有相同的名称:
MyNamespace.Class1
MyOtherNamespace.Class1

两者都尝试使用视图定义的显示模板:

Class1.cshtml

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

@model MyNamespace.Class1

这意味着,如果你有一个采用MyOtherNamespace.Class1的DisplayFor,你会因为类型不匹配而出现运行时错误。

如果您事先知道将发生这种情况的位置,则可以使用 UIHint 强制 DisplayFor 使用替代模板(或者可以直接在视图中使用命名模板(。但是,如果您事先不知道(您将所有这些对象都包含在某种枚举中,因此无法编写特定的代码来处理这样的边缘情况而无需大量笨拙的反射 - 有没有办法为这些类提供 DisplayTemplates?

我以前没有尝试过这样的事情,但它应该可以工作。您可以让视图接受泛型模型类型(如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);
}

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

最新更新