MVC TextAreaFor 具有值呈现空框
MVC TextAreaFor with value rendering empty box
我正在尝试使用控制器提供的默认值生成一个 TextArea
框。给定这个调用局部视图的标记:
@{
Html.RenderAction(
"ContentBlock", "ContentBlock",
new TestSiteMvc.Models.ContentModel() { ContentID = 3 }
);
}
局部视图:
@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 />
渲染的结果 HTML 是:
<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 />
很明显,ContentHtml 属性 正在填充。我不明白的是为什么 TextAreaFor
被渲染为空值。需要明确的是,当我删除行 @Html.TextBoxFor(m => m.ContentHtml)
以不产生具有相同 ID 的标签时,问题并没有消失。
控制器:
[HttpGet]
public ActionResult ContentBlock(Models.ContentModel mcontent) {
mcontent = new Models.ContentModel() {
ContentID = 3,
ContentHtml = "Home Page Content",
Title = "Home Title" };
return PartialView(mcontent);
}
型号:
public class ContentModel {
public int ContentID { get; set; }
public string Link { get; set; }
public string Title { get; set; }
public string ContentHtml { get; set; }
public DateTime LastModifiedDate { get; set; }
}
您的 GET 方法有一个参数是您的模型,因此 DefaultModelBinder
使用默认值初始化 ContentModel
并将 ContentID
的值设置为 3
。此时所有值都添加到 ModelState
(ModelState
中 ContentHtml
的值是 null
- string
的默认值)。更新属性值不会影响 ModelState
.
中的值
当您 return 视图时,@Html.TextAreaFor()
首先检查 ModelState
,在您的情况下是 null
,因此不会呈现任何值。 (如果未找到 ModelState
中的值,则该方法会检查 ViewData
,最后检查模型的实际值 属性 以确定要渲染的内容。
另请注意,@Html.TextArea("ContentHtml2", Model.ContentHtml)
有效,因为它未绑定到模型 属性 并且您使用的重载专门根据另一个 属性.[=31= 设置值]
解决此问题的正确方法也是最简单的方法是将控制器方法更改为
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()
方法将从型号 属性)
我正在尝试使用控制器提供的默认值生成一个 TextArea
框。给定这个调用局部视图的标记:
@{
Html.RenderAction(
"ContentBlock", "ContentBlock",
new TestSiteMvc.Models.ContentModel() { ContentID = 3 }
);
}
局部视图:
@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 />
渲染的结果 HTML 是:
<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 />
很明显,ContentHtml 属性 正在填充。我不明白的是为什么 TextAreaFor
被渲染为空值。需要明确的是,当我删除行 @Html.TextBoxFor(m => m.ContentHtml)
以不产生具有相同 ID 的标签时,问题并没有消失。
控制器:
[HttpGet]
public ActionResult ContentBlock(Models.ContentModel mcontent) {
mcontent = new Models.ContentModel() {
ContentID = 3,
ContentHtml = "Home Page Content",
Title = "Home Title" };
return PartialView(mcontent);
}
型号:
public class ContentModel {
public int ContentID { get; set; }
public string Link { get; set; }
public string Title { get; set; }
public string ContentHtml { get; set; }
public DateTime LastModifiedDate { get; set; }
}
您的 GET 方法有一个参数是您的模型,因此 DefaultModelBinder
使用默认值初始化 ContentModel
并将 ContentID
的值设置为 3
。此时所有值都添加到 ModelState
(ModelState
中 ContentHtml
的值是 null
- string
的默认值)。更新属性值不会影响 ModelState
.
当您 return 视图时,@Html.TextAreaFor()
首先检查 ModelState
,在您的情况下是 null
,因此不会呈现任何值。 (如果未找到 ModelState
中的值,则该方法会检查 ViewData
,最后检查模型的实际值 属性 以确定要渲染的内容。
另请注意,@Html.TextArea("ContentHtml2", Model.ContentHtml)
有效,因为它未绑定到模型 属性 并且您使用的重载专门根据另一个 属性.[=31= 设置值]
解决此问题的正确方法也是最简单的方法是将控制器方法更改为
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()
方法将从型号 属性)