gpt4 book ai didi

asp.net-mvc - EditorFor 不适用于派生类型

转载 作者:行者123 更新时间:2023-12-04 15:36:24 25 4
gpt4 key购买 nike

至少,我认为这与问题有关。我的场景是这样的:

我有许多具有通用字段的业务实体,每个实体都有该实体独有的自定义字段。所以在代码中,这被建模为 EntityBase类,并且有许多类派生自此,例如,Derived .

为了制作可重用的 UI,我有一个名为 EntityBase.vbhtml 的 View 。看起来像这样:

@ModelType EntityBase

@Using Html.BeginForm("Edit", Model.GetType.Name)
@* show the editor template for the derived type *@
@* !!the next line renders nothing!! *@
@Html.EditorFor(Function(x) Model, Model.GetType.Name)

[show a bunch of stuff common to all EntityBase objects]
End Using

然后一个叫 Derived.vbhtml对于执行此操作的派生类:
@ModelType Derived
[show an EditorFor for various Derived-specific fields]

然后,当您导航到 \Derived\Edit\123 时,它返回默认 View Derived\Edit.vbhtml ,它只是这样做:
@Html.EditorForModel("EntityBase")

这样, Controller 只返回预期的默认编辑 View ,这是对 EntityBase 的单行调用。 View ,它做它的事情并调用 Derived呈现它不知道的派生类内容。

我认为这很不起眼,但它不起作用。如 View 代码中所标记,当我在基类 View 中调用 EditorForModel 时,指定派生类的名称以用作模板,它不会呈现任何内容。我已经测试过,如果我在顶级 Edit 模板中调用这行完全相同的代码,它可以正常工作。所以有一些MVC不喜欢的继承,但我看不出是什么。请帮忙!

更新 : 如果不是 EditorFor,它会按我的预期工作我用 Partial (并将相应的模板从 EditorTemplates 文件夹移动到 Shared 文件夹),但这不是一个很好的解决方案,因为我认为不遵循 EditorFor 模板的命名约定会令人困惑。

最佳答案

看起来,虽然 MVC 在这种情况下不会定位命名模板,但如果您指定模板的完整路径,它会找到它。因此,与其进一步抗争,我实现了以下辅助函数:

<Extension()> _
Public Function EditorForObject(Of T, TValue)(ByVal htmlHelper As HtmlHelper(Of T), ByVal obj As TValue) As IHtmlString
Dim sTemplateName = "~/Views/Shared/EditorTemplates/" & obj.GetType.Name & ".vbhtml"

'Return htmlHelper.EditorFor(Function(x) obj) <-- this should work but doesn't
Return htmlHelper.Partial(sTemplateName, obj)
End Function

在英语中,这意味着:向对象询问其类型名称,形成该类型的编辑器模板的显式路径,然后调用 HtmlHelper.Partial,指定对象和模板的完整路径。我确信这可能更通用(而不是为 vb 硬编码),但它有效。

那么用法是这样的:
@Html.EditorForObject(Model)

实际上,这甚至比我尝试做的还要好,这要困惑得多:
@Html.EditorFor(Function(x) Model, Model.GetType.Name)

即使没有模板查找问题,这也会很方便,因为能够传递一个对象进行编辑(或显示)很方便,而不是一个只返回该对象的虚拟 lambda。

不过,我认为查找问题一定是 MVC 中的错误。 (如果我有时间,我想我可以检查源代码。)任何人都可以对此进行确认或评论吗?

关于asp.net-mvc - EditorFor 不适用于派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8245851/

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