0

好吧,我整个上午都在这上面迷路了,我无处可去。

我对 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 有旧数据。

这真的让我很紧张,因为我无法真正理解发生了什么。

任何帮助将不胜感激。

4

2 回答 2

0

我做了很多实验,发现问题出在我不知道的基类上的 actionfilter 上。MvcContrib 的“PassParametersDurignRedirect”过滤器。没有它一切正常。

于 2012-12-07T12:30:31.137 回答
0

你试过 ModelState.Clear()

当你完成搜索电话?

于 2012-11-30T13:43:17.750 回答