我尝试使用控制器提供的默认值生成anArray
框。鉴于此标记调用部分视图:
TextArea
部分视图:
@{
Html.RenderAction(
"ContentBlock", "ContentBlock",
new TestSiteMvc.Models.ContentModel() { ContentID = 3 }
);
}
生成的HTML呈现为:
@Html.TextBoxFor(m=>m.Title)
@Model.ContentHtml<br />
@Html.TextAreaFor(m => m.ContentHtml)
@Html.TextBoxFor(m => m.ContentHtml)
@Html.TextArea("ContentHtml2", Model.ContentHtml)
@Model.ContentHtml<br />
因此,很明显ContentHtml属性已经填充。我不明白为什么<input id="Title" name="Title" type="text" value="Home Title" />
Home Page Content<br />
<textarea cols="20" id="ContentHtml" name="ContentHtml" rows="2"></textarea>
<input id="ContentHtml" name="ContentHtml" type="text" value="Home Page Content" />
<textarea cols="20" id="ContentHtml2" name="ContentHtml2" rows="2">Home Page Content</textarea>
Home Page Content<br />
使用空值进行渲染。需要明确的是,当我删除行TextAreaFor
以避免产生具有相同ID的标记时,问题就不会消失。
控制器:
@Html.TextBoxFor(m => m.ContentHtml)
型号:
[HttpGet]
public ActionResult ContentBlock(Models.ContentModel mcontent) {
mcontent = new Models.ContentModel() {
ContentID = 3,
ContentHtml = "Home Page Content",
Title = "Home Title" };
return PartialView(mcontent);
}
答案 0 :(得分:1)
您的GET方法有一个参数是您的模型,因此DefaultModelBinder
会使用默认值初始化ContentModel
,并将ContentID
的值设置为3
。此时,所有值都会添加到ModelState
(ContentHtml
中ModelState
的值为null
- string
的默认值。更新属性值不会影响ModelState
中的值。
当您返回视图时,@Html.TextAreaFor()
首先检查ModelState
,在您的情况下为null
,因此不会呈现任何值。 (如果找不到ModelState
中的值,则该方法检查ViewData
,最后检查模型属性的实际值以确定要呈现的内容。
另请注意@Html.TextArea("ContentHtml2", Model.ContentHtml)
有效,因为它不绑定到模型属性,并且您使用的是基于另一个属性专门设置值的重载。
正确的方法,最简单的解决方法是将控制器方法更改为
public ActionResult ContentBlock(int id)
{
ContentModel model = new ContentModel()
{
ContentID = id,
ContentHtml = "Home Page Content",
Title = "Home Title"
};
return PartialView(model);
}
并将视图代码更改为
@{ Html.RenderAction( "ContentBlock", "ContentBlock", new { id = 3 }); }
或者,您可以添加ModelState.Clear()
作为控制器方法中的第一行代码,以从ModelState
中删除所有值(TextAeaFor()
方法将从模型属性中获取值)