首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Asp.net MVC ModelState.Clear

Asp.net MVC ModelState.Clear
EN

Stack Overflow用户
提问于 2009-11-21 19:04:10
回答 10查看 116.8K关注 0票数 119

有人能给我一个简洁的定义吗? ModelState在Asp.net MVC中的作用(或者一个链接)。特别是,我需要知道在什么情况下调用ModelState.Clear()是必要的或可取的。

位是开放式的,嗯,...抱歉,我想告诉你我到底在做什么可能会有帮助:

我在一个名为"Page“的控制器上执行了一个编辑操作。当我第一次看到用于更改页面详细信息的表单时,一切都正常加载(绑定到"MyCmsPage“对象)。然后单击一个按钮,该按钮为MyCmsPage对象的一个字段(MyCmsPage.SeoTitle)生成值。它生成fine并更新对象,然后我返回带有新修改的页面对象的操作结果,并期望更新相关的文本框(使用<%= 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>
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-04-21 05:54:51

我认为这是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); 
}

按照预期工作。

我不认为这是一个“特性”,不是吗?

票数 140
EN

Stack Overflow用户

发布于 2009-11-21 19:11:21

更新:

  • 这不是一个bug。
  • 请停止从POST操作返回View()。如果操作成功,请改用PRG并重定向到GET。
  • 如果要从POST操作返回View(),请执行表单验证,并使用内置帮助器以MVC is designed的方式执行。如果你这样做,那么你就不需要使用.Clear()
  • If你正在使用这个动作来返回一个SPA的ajax,使用一个web api控制器,忘记ModelState,因为你无论如何都不应该使用它。

的老答案:

ModelState主要用于描述模型对象的状态,很大程度上与该对象是否有效有关。This tutorial应该解释很多。

通常,您不需要清除ModelState,因为它是由MVC引擎为您维护的。当尝试遵循MVC验证的最佳实践时,手动清除它可能会导致不希望的结果。

您似乎正在尝试为标题设置默认值。这应该在模型对象实例化(域层某处或在对象本身中-无参数的ctor)时完成,在get操作上,以便它第一次下到页面或完全在客户端(通过ajax或其他方式),这样看起来就像用户输入了它,并返回了张贴的表单集合。您在接收forms集合时添加此值的方法(在POST操作//编辑中)如何导致这种奇怪的行为,从而可能导致.Clear()似乎为您工作。相信我-你不会想要使用清晰的。试一下其他的想法。

票数 48
EN

Stack Overflow用户

发布于 2010-03-19 08:35:54

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

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

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

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1775170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档