3 回答
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); }
按预期工作。
我不认为这是一个“功能”,是吗?
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。尝试其他一个想法。
TA贡献1808条经验 获得超4个赞
如果要清除单个字段的值,那么我发现以下技术很有用。
ModelState.SetModelValue("Key", new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture));
注意:将 “Key”更改为要重置的字段的名称。
- 3 回答
- 0 关注
- 361 浏览
添加回答
举报