猿问

Asp.net MVC ModelState.Clear

Asp.net MVC ModelState.Clear

任何人都可以给我一个关于ModelState在Asp.net MVC中的角色的简洁定义(或者链接到一个)。特别是我需要知道在什么情况下打电话是必要的或可取的ModelState.Clear()

有点开放了 ......对不起,我想如果告诉你我在做什么可能会有所帮助:

我在一个名为“Page”的控制器上有一个Edit of Action。当我第一次看到表单来更改页面的详细信息时,所有内容都很好地加载(绑定到“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>


慕工程0101907
浏览 362回答 3
3回答

慕桂英3389331

我认为是MVC中的一个错误。我今天花了几个小时努力解决这个问题。鉴于这种:public&nbsp;ViewResult&nbsp;SomeAction(SomeModel&nbsp;model)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;model.SomeString&nbsp;=&nbsp;"some&nbsp;value"; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;View(model);&nbsp;}视图使用原始模型呈现,忽略更改。所以我想,也许它不喜欢我使用相同的模型,所以我尝试这样:public&nbsp;ViewResult&nbsp;SomeAction(SomeModel&nbsp;model)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newModel&nbsp;=&nbsp;new&nbsp;SomeModel&nbsp;{&nbsp;SomeString&nbsp;=&nbsp;"some&nbsp;value"&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;View(newModel);&nbsp;}并且视图仍然使用原始模型呈现。奇怪的是,当我在视图中放置断点并检查模型时,它具有更改的值。但响应流具有旧值。最终我发现了你做过的同样的工作:public&nbsp;ViewResult&nbsp;SomeAction(SomeModel&nbsp;model)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newModel&nbsp;=&nbsp;new&nbsp;SomeModel&nbsp;{&nbsp;SomeString&nbsp;=&nbsp;"some&nbsp;value"&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;ModelState.Clear(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;View(newModel);&nbsp;}按预期工作。我不认为这是一个“功能”,是吗?

尚方宝剑之说

更新:这不是一个错误。请停止View()从POST操作返回。如果操作成功,请改用PRG并重定向到GET。如果您在返回View()从POST动作,连续做表单验证,并做到这一点的方式MVC设计使用内置的助手。如果你这样做,那么你不应该使用.Clear()如果您正在使用此操作返回SPA的&nbsp;ajax&nbsp;,请使用web api控制器并忘记,ModelState因为您无论如何都不应该使用它。老答案:MVC中的ModelState主要用于描述模型对象的状态,主要与该对象是否有效有关。本教程应该解释很多。通常,您不需要清除ModelState,因为它由MVC引擎为您维护。在尝试遵守MVC验证最佳实践时,手动清除它可能会导致意外结果。您似乎正在尝试为标题设置默认值。这应该在模型对象被实例化时(在某个地方或在对象本身 - 无参数的ctor中),在get动作上进行,以便它第一次或完全在客户端(通过ajax或其他)下载到页面这样看起来好像用户输入了它,然后它返回了已发布的表单集合。一些如何在接收表单集合时添加此值的方法(在POST操作//编辑中)导致这种奇怪的行为可能导致.Clear()&nbsp;看起来适合您。相信我 - 你不想使用clear。尝试其他一个想法。

炎炎设计

如果要清除单个字段的值,那么我发现以下技术很有用。ModelState.SetModelValue("Key",&nbsp;new&nbsp;ValueProviderResult(null,&nbsp;string.Empty,&nbsp;CultureInfo.InvariantCulture));注意:将&nbsp;“Key”更改为要重置的字段的名称。
随时随地看视频慕课网APP
我要回答