asp.net-mvc – Asp.net MVC ModelState.Clear

任何人都可以给我一个简洁的定义ModelState在Asp.net MVC(或链接到一个)的作用。特别是我需要知道在什么情况下需要或者希望调用ModelState.Clear()。

Bit open ended huh …对不起,我想如果告诉你我可以做什么可能会有帮助:

我在控制器上有一个“编辑操作”,称为“页面”。当我第一次看到表单更改页面的细节一切加载正常(绑定到一个“MyCmsPage”对象)。然后我单击一个按钮,为MyCmsPage对象的字段(MyCmsPage.SeoTitle)之一生成一个值。它生成精细并更新对象,然后返回具有新修改的页面对象的动作结果,并期望相关的文本框(使用<%= Html.TextBox(“seoTitle”,page.SeoTitle)%>更新…但是它显示从加载的旧模型的值。

我使用ModelState.Clear()解决它,但我需要知道为什么/它是如何工作的,所以我不只是盲目地做它。

PageController:

[AcceptVerbs("POST")]
public ActionResult Edit(MyCmsPage page, string submitButton)
{
    // add the seoTitle to the current page object
    page.GenerateSeoTitle();

    // why must I do this?
    ModelState.Clear();

    // return the modified page object
     return View(page);
 }

Aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyCmsPage>" %>
....
        <div class="c">
            <label for="seoTitle">
                Seo Title</label>
            <%= Html.TextBox("seoTitle", page.SeoTitle)%>
            <input type="submit" value="Generate Seo Title" name="submitButton" />
        </div>
最佳答案
我认为是MVC中的一个bug。我今天努力了几个小时。

鉴于:

public ViewResult SomeAction(SomeModel model) 
{
    model.SomeString = "some value";
    return View(model); 
}

视图使用原始模型呈现,忽略更改。所以我想,也许它不喜欢我使用相同的模型,所以我试着这样:

public ViewResult SomeAction(SomeModel model) 
{
    var newModel = new SomeModel { SomeString = "some value" };
    return View(newModel); 
}

仍然视图渲染与原始模型。奇怪的是,当我在视图中放置断点并检查模型时,它的值已更改。但响应流有旧的值。

最后,我发现了你所做的同样的工作:

public ViewResult SomeAction(SomeModel model) 
{
    var newModel = new SomeModel { SomeString = "some value" };
    ModelState.Clear();
    return View(newModel); 
}

按预期工作。

我不认为这是一个“功能”,是吗?

转载注明原文:asp.net-mvc – Asp.net MVC ModelState.Clear - 代码日志