C# 使用GET方法提交表单

C# 使用GET方法提交表单,c#,asp.net,asp.net-mvc,model-binding,http-get,C#,Asp.net,Asp.net Mvc,Model Binding,Http Get,好吧,我在这件事上浪费了整个上午,我一事无成 我对MVC有着很好的经验,从2008年第一次Beta开始就一直在使用它,但我真的不明白这一点 我基本上有两个GET方法:第一个是渲染表单。第二个是表单指向的方法。我使用GET提交,因为它是一个搜索表单,我希望有一个带有参数的可书签URL 像这样的 [HttpGet] public ActionResult DisplayForm() { Contract.Ensures(Contract.Result<ActionResult>(

好吧,我在这件事上浪费了整个上午,我一事无成

我对MVC有着很好的经验,从2008年第一次Beta开始就一直在使用它,但我真的不明白这一点

我基本上有两个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();
}
[HttpGet]
公共行动结果显示表单()
{
Contract.sure(Contract.Result()!=null);
Contract.Result(Contract.Result()是ViewResult);
返回这个.View();
}
[HttpGet]
公共操作结果搜索(MyViewModel viewModel)
{
Contract.Requires(viewModel!=null);
Contract.sure(Contract.Result()!=null);
Contract.Result(Contract.Result()是ViewResult | | Contract.Result()是RedirectToRouteResult);
var result=this.validator.Validate(viewModel);//FluentValidation验证
如果(!result.IsValid)
{
result.FillModelState(this.ModelState);//在下面使用AddModelError对搜索表单上的帮助程序进行验证的扩展方法
返回此.RedirectToAction(c=>c.DisplayForm());//MvcContrib重定向到操作
}
ViewData.Model=viewModel;
返回视图();
}
我第一次提交表单时,目标方法中的viewData得到了正确填充

如果我返回并进行另一次搜索,就像modelbinder“缓存”了我第一次提交的数据:viewData始终具有第一次搜索的值。它只会重新启动应用程序

我试着检查ModelState和HttpContext.Request,它们确实有新数据(不是过时的),但viewData仍然会被旧数据填充。我还尝试重写OnActionExecuting和OnActionExecuted,只是为了在其中放置一个断点并在这些步骤中检查ModelState,但没有发现任何奇怪的地方

我还尝试通过浏览器栏直接调用搜索方法,因为它在GET中,我可以做到。尽管如此,ModelState和Request包含我输入的数据,但是viewData包含旧数据

这真的让我很紧张,因为我真的不明白发生了什么

非常感谢您的帮助。

您试过了吗 ModelState.Clear()


完成搜索调用后?

我做了很多实验,发现问题出在基类上的actionfilter上,我没有意识到。MvcContrib的“PasspParametersDurignRedirect”筛选器。没有它,一切正常。

考虑使用Ajax吗?我不确定您的搜索表单有多复杂?请让我们看一下代码好吗?您应该向我们展示完整的代码,包括视图。好的,完整的代码就在后面。视图不相关,只包含一个带有method=“Get”和目标URL的纯@Html.TextBoxFor等表单。此外,我还指出,即使跳过HTML并直接调用该方法,也会出现问题。给我几分钟时间把代码匿名化并发布。好吧,用代码编辑。我试过了,但还是不行。除此之外,modelstate包含我所说的正确数据。这看起来像是modelbinder的问题,但我真的不能说。