好吧,我整个上午都在这上面迷路了,我无处可去。
我对 MVC 有很好的体验,自 2008 年第一个测试版以来一直在使用它,但我无法真正弄清楚这一点。
我基本上有 2 个 GET 方法:第一个呈现表单。第二个是表单指向的方法。我使用 GET 提交,因为它是一个搜索表单,并且我想要一个带有参数的可收藏 URL。
像这样的东西
[HttpGet]
public ActionResult DisplayForm()
{
Contract.Ensures(Contract.Result<ActionResult>() != null);
Contract.Ensures(Contract.Result<ActionResult>() is ViewResult);
return this.View();
}
[HttpGet]
public ActionResult Search(MyViewModel viewModel)
{
Contract.Requires<ArgumentNullException>(viewModel != null);
Contract.Ensures(Contract.Result<ActionResult>() != null);
Contract.Ensures(Contract.Result<ActionResult>() is ViewResult || Contract.Result<ActionResult>() is RedirectToRouteResult);
var result = this.validator.Validate(viewModel); //FluentValidation validation
if (!result.IsValid)
{
result.FillModelState(this.ModelState); //extension method that uses AddModelError underneath for ValidationMessageFor helpers on search form
return this.RedirectToAction(c => c.DisplayForm()); //MvcContrib redirect to action
}
ViewData.Model = viewModel;
return View();
}
第一次提交表单时,目标方法中的 viewData 会正确填充。
如果我回去再做一次搜索,就像模型绑定器“缓存”了我第一次提交的数据:viewData 总是具有第一次搜索的值。它仅重置重新启动应用程序。
我尝试检查 ModelState 和 HttpContext.Request 并且它们确实包含新数据(不是陈旧的),但 viewData 仍然填充了旧数据。我还尝试重写 OnActionExecuting 和 OnActionExecuted 只是为了在其中放置一个断点并在这些步骤中检查 ModelState,并没有发现任何奇怪的东西。
我还尝试通过浏览器栏直接调用 Search 方法,因为它在 GET 中,我可以做到。尽管如此,ModelState 和 Request 包含我输入的数据,但 viewData 有旧数据。
这真的让我很紧张,因为我无法真正理解发生了什么。
任何帮助将不胜感激。