模型的奇怪行为

时间:2015-05-12 14:10:15

标签: c# .net asp.net-mvc

所以这很奇怪。我有一个由List<person>person组成的模型。当用户将视图提交回控制器时,List<person>会添加到person,然后我们会通过person=new Person();清除所有person字段。< / p>

我希望在返回视图时,清除所有person字段,并且视图是&#34;新鲜&#34;开始。但是,由于某些原因我无法弄清楚,person=new Person();的大多数字段仍然填充了之前的值(即使在 [HttpPost] [ValidateAntiForgeryToken()] public ActionResult sendInscriptorRequest(inscriptionModel _model) { var _umbracoModel = Umbraco.TypedContentAtRoot().FirstOrDefault(); _model = bllInscripcion.fillModel(_model); _model = _model.Map(_umbracoModel); if (_model.formAction == "addParticipants") { _model.participants.Add(_model.newParticipant); _model.newParticipant = new participantModel(); _model.ui.participants.btnTotalParticipantsNumber += 1; return View("addParticipants", _model); } else { _model.newParticipant = bllInscripcion.preFillParticipantContactWithInscriptorContact(_model); return View("formularioInscripcion2", _model); } } 之后)。

模型是一个复杂的模型,由几个对象对象组成,一些对象继承自其他对象。不过,我无法理解为什么视图仍会显示以前帖子中的值。

编辑!!!!!

我通过常规表单发布(HTML.BeginForm())。所以这是我的控制器:

dependencies {
   testCompile(group: 'org.neo4j', 
               name: 'neo4j-ogm-test', 
               version: '1.0.0.BUILD-SNAPSHOT', 
               classifier: 'tests')
} 
repositories {
   maven {
     url 'http://repo.spring.io/libs-snapshot-continuous-local'
  }
}

2 个答案:

答案 0 :(得分:3)

您尝试使用POST操作方法中的模型返回视图。这不会起作用,因为预期的行为是返回已发布的模型状态,以便用户可以进行更正。

如果您要发布数据,然后想要返回空视图,则应重定向到返回视图初始状态的GET操作方法。它被称为Post-Redirect-Get模式。

http://en.wikipedia.org/wiki/Post/Redirect/Get

遵循此模式还可以解决用户在POST之后刷新页面的问题,并获得说出&#34;您即将重新提交数据的恼人对话框。你确定吗?&#34;用户总是回应&#34;是&#34;然后你的系统必须处理潜在的重复。

答案 1 :(得分:2)

问题说明:

这是因为server.log。默认情况下,如果您返回相同的视图,MVC将在后期操作中保留模型状态。要防止这种情况,只需在返回视图之前清除它:

ModelState

这意味着将使用您传回视图的任何模型,而不是存储在模型状态中的模型。

<强>声明:

您应该仅在需要时使用ModelState.Clear(); 。根据您的代码判断,您不需要使用它。在执行必要的逻辑后,简单地重定向到另一个页面是更好的事情(根据PRG模式)。