【问题标题】:EditorFor isn't working on derived typeEditorFor 不适用于派生类型
【发布时间】:2012-01-04 23:04:08
【问题描述】:

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

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

为了制作可重用的 UI,我有一个名为 EntityBase.vbhtml 的视图,如下所示:

@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 时,它会返回默认视图Derived\Edit.vbhtml,它就是这样做的:

@Html.EditorForModel("EntityBase")

通过这种方式,控制器只返回预期的默认编辑视图,这是对EntityBase 视图的单行调用,它执行它的工作并调用Derived 来呈现它没有的派生类内容知识。

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

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

【问题讨论】:

    标签: asp.net-mvc vb.net asp.net-mvc-3 razor editorformodel


    【解决方案1】:

    看起来,虽然 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 中的错误。 (如果我有时间,我想我可以查看源代码。)任何人都可以对此进行确认或评论吗?

    【讨论】:

    • 我遇到了同样的问题。感谢您提供了一个很好的解决方法。我正要放弃:)
    • 很高兴听到这个消息!我真的把头发扯掉了。
    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 2012-09-11
    • 2014-09-23
    • 1970-01-01
    • 2011-12-29
    • 2020-04-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多