ViewBag.Title值覆盖ASP.NET MVC编辑器模板的Model.Title

时间:2013-01-04 09:40:29

标签: asp.net-mvc viewbag mvc-editor-templates editorformodel

当我在Razor模板顶部设置ViewBag.Title时,Model.Title编辑器模板文本框将使用ViewBag.Title的值而不是预期的Model.Title值进行填充。明确调用Html.EditorFor(x => Model.Title)不会产生此行为。

如果不为我的模型维护自定义编辑器模板,如何阻止我的编辑器模板显示ViewBag.Title值?

代码

@{
    ViewBag.Title = "Edit Post " + Model.Title;
}

@Html.EditorFor(x => Model.Title) @* renders "My Title" text box *@
@Html.EditorFor(x => Model)       @* renders "Edit Post My Title" text box *@

2 个答案:

答案 0 :(得分:7)

Html.EditorFor使用的值可以来自三个位置:ModelStateViewDataModel。顺便说一下,ViewDataViewBag是相同的东西,两种与同一基础字典交互的方式。

因此,为了避免在处理表单时发生冲突,您可以使用模型,也可以使用前缀,例如ViewBag._Title


在这种情况下ViewBag.Title用于与布局共享数据,您也可以执行Page.Title而无需担心更改视图数据。

答案 1 :(得分:2)

避免这种情况的简单方法就是不使用ViewBag

ViewBag是一个动态对象,它确实优先。但是你可以在里面填充任何东西,而且调试变得很困难。

底线:如果您需要显示动态内容,例如标题,请将其放入Model