gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:57:52 30 4
gpt4 key购买 nike

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

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

MyNamespace.Class1
MyOtherNamespace.Class1

两者都尝试使用 View 定义的 DisplayTemplate:

Class1.cshtml

但是在 View 文件中你必须声明模型——例如:

@model MyNamespace.Class1

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

如果您事先知道发生这种情况的位置,您可以使用 UIHint 强制 DisplayFor 使用替代模板(或者您可以直接在 View 中使用命名模板)。但是,如果您事先不知道(您将所有这些对象都放在某种枚举中,因此如果不进行大量笨拙的反射(reflection)就无法编写特定的代码来处理像这样的边缘情况 - 是有什么方法可以为这些类设置 DisplayTemplates 吗?

最佳答案

我以前没有尝试过类似的东西,但它应该可以工作。您可以让 View 接受一个通用模型类型,例如 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);
}

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

关于c# - 如何处理具有相同名称(不同命名空间)的两个类的 MVC DisplayTemplates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45695649/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com