使用GET方法提交表单

时间:2012-11-30 13:38:20

标签: c# asp.net asp.net-mvc model-binding http-get

好吧,我整个早上都因此而失去了,我无处可去。

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

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

真的很感激任何帮助。

2 个答案:

答案 0 :(得分:0)

你试过吗?     ModelState.Clear()

完成搜索电话后?

答案 1 :(得分:0)

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