有人能给我一个简洁的定义吗? 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>
发布于 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);
}
按照预期工作。
我不认为这是一个“特性”,不是吗?
发布于 2009-11-21 19:11:21
更新:
View()
。如果操作成功,请改用PRG并重定向到GET。View()
,请执行表单验证,并使用内置帮助器以MVC is designed的方式执行。如果你这样做,那么你就不需要使用.Clear()
ModelState
,因为你无论如何都不应该使用它。的老答案:
ModelState主要用于描述模型对象的状态,很大程度上与该对象是否有效有关。This tutorial应该解释很多。
通常,您不需要清除ModelState,因为它是由MVC引擎为您维护的。当尝试遵循MVC验证的最佳实践时,手动清除它可能会导致不希望的结果。
您似乎正在尝试为标题设置默认值。这应该在模型对象实例化(域层某处或在对象本身中-无参数的ctor)时完成,在get操作上,以便它第一次下到页面或完全在客户端(通过ajax或其他方式),这样看起来就像用户输入了它,并返回了张贴的表单集合。您在接收forms集合时添加此值的方法(在POST操作//编辑中)如何导致这种奇怪的行为,从而可能导致.Clear()
似乎为您工作。相信我-你不会想要使用清晰的。试一下其他的想法。
发布于 2010-03-19 08:35:54
如果您想要清除单个字段的值,那么我发现以下技术很有用。
ModelState.SetModelValue("Key", new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture));
注意:将"Key“更改为要重置的字段的名称。
https://stackoverflow.com/questions/1775170
复制相似问题