好吧,我整个早上都因此而失去了,我无处可去。
我对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具有旧数据。
这真让我紧张,因为我无法理解发生了什么。
真的很感激任何帮助。
答案 0 :(得分:0)
你试过吗? ModelState.Clear()
完成搜索电话后?
答案 1 :(得分:0)
我进行了很多实验,我发现问题出现在我不知道的基类上的actionfilter上。 MvcContrib的“PassParametersDurignRedirect”过滤器。没有它,一切正常。