EditorTemplates / Object.cshtml使用EditorFor()而不是Editor()?

时间:2011-04-14 16:34:01

标签: asp.net-mvc asp.net-mvc-3

我正在尝试创建一个复制Html.EditorForModel()的通用编辑器模板,以便以后自定义和构建。 Brad Wilson's template变得非常接近,但我发现当ViewData(或ViewBag)和模型中存在相同的密钥时,它会窒息。例如,如果视图模型也具有ViewBag.Title属性,则Title会导致问题。

我了解到here使用强类型助手(即Html.EditorFor(x => x.Title)而不是Html.Editor("Title")似乎有所帮助。所以我试图修改Brad的模板,但我碰到了一堵砖墙,因为到目前为止我没有尝试过任何工作。我无法弄清楚如何在我不知道模型类型的上下文中使用强类型帮助器,例如编辑器模板。

有没有办法像Brad那样创建一个Object模板,但是使用强类型的助手(即LabelFor,EditorFor,ValidatorMessageFor)而不是弱类型的助手(即Label,Editor,ValidatorMessage)?

感谢。

2 个答案:

答案 0 :(得分:5)

我以稍微迂回的方式解决了这个问题,方法是在调用@ Html.Editor之前删除ViewData,然后再将其放回去。

<强> Object.cshtml:

        object oldViewData = null;
        var hasConflictingViewData = ViewData.TryGetValue(prop.PropertyName, out oldViewData);

        if (hasConflictingViewData)
        {
            ViewData.Remove(prop.PropertyName);
        }

        @Html.Editor(prop.PropertyName)

        if (hasConflictingViewData)
        {
            ViewData.Add(prop.PropertyName, oldViewData);
        }

我能想到的唯一另一个选择是使用大量的反射来调用EditorFor,一般使用运行时类型,并传入相关属性的表达式。

答案 1 :(得分:1)

您可以通过下载MVC源代码来查看新Object.shtml的所有代码。我以为它已经在你电脑上的一些常见文件夹中,但我不记得在哪里。

http://aspnet.codeplex.com/releases/view/58781