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。此时所有值都添加到 ModelStateModelStateContentHtml 的值是 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() 方法将从型号 属性)