MVC TextAreaFor用值渲染空框

时间:2016-12-19 17:00:39

标签: asp.net-mvc textarea

我尝试使用控制器提供的默认值生成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);
    }

1 个答案:

答案 0 :(得分:1)

您的GET方法有一个参数是您的模型,因此DefaultModelBinder会使用默认值初始化ContentModel,并将ContentID的值设置为3。此时,所有值都会添加到ModelStateContentHtmlModelState的值为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()方法将从模型属性中获取值)