为了账号安全,请及时绑定邮箱和手机立即绑定

Asp.net MVC ModelState.Clear

Asp.net MVC ModelState.Clear

慕工程0101907 2019-11-17 16:12:41
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>
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

我认为是MVC中的一个错误。我今天花了几个小时努力解决这个问题。

鉴于这种:

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); }

按预期工作。

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



查看完整回答
反对 回复 2019-11-18
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

更新:

  • 这不是一个错误。

  • 请停止View()从POST操作返回。如果操作成功,请改用PRG并重定向到GET。

  • 如果您返回View()从POST动作,连续做表单验证,并做到这一点的方式MVC设计使用内置的助手。如果你这样做,那么你不应该使用.Clear()

  • 如果您正在使用此操作返回SPA的 ajax ,请使用web api控制器并忘记,ModelState因为您无论如何都不应该使用它。

老答案:

MVC中的ModelState主要用于描述模型对象的状态,主要与该对象是否有效有关。本教程应该解释很多。

通常,您不需要清除ModelState,因为它由MVC引擎为您维护。在尝试遵守MVC验证最佳实践时,手动清除它可能会导致意外结果。

您似乎正在尝试为标题设置默认值。这应该在模型对象被实例化时(在某个地方或在对象本身 - 无参数的ctor中),在get动作上进行,以便它第一次或完全在客户端(通过ajax或其他)下载到页面这样看起来好像用户输入了它,然后它返回了已发布的表单集合。一些如何在接收表单集合时添加此值的方法(在POST操作//编辑中)导致这种奇怪的行为可能导致.Clear() 看起来适合您。相信我 - 你不想使用clear。尝试其他一个想法。



查看完整回答
反对 回复 2019-11-18
?
炎炎设计

TA贡献1808条经验 获得超4个赞

如果要清除单个字段的值,那么我发现以下技术很有用。

ModelState.SetModelValue("Key", new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture));

注意:将 “Key”更改为要重置的字段的名称。


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 329 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信