表单提交MVC 3 asp.NET后错误的URI

时间:2012-06-06 00:36:31

标签: asp.net asp.net-mvc-3 url-routing

我对此处的某些事情感到有些困惑。我有一个表单,该表单的URL是:

http://domain.com/Home/requestquote

当我在表单上单击“提交”并且处理位于表单控制器中的此表单的方法发回一个视图时,URI如下所示:

http://domain.com/form/requestQuoteSubmit其中requestQuoteSubmit是方法。

当验证将页面返回错误时以及成功提交表单时都会发生这种情况。

成功后,发回的视图为Home/thanks,如果出错,则应发送回Home/requestquote。一切似乎工作正常,除了URI不是它应该是什么的事实。这会导致页面上的其他所有内容中断,因为我的链接如下所示:

@Url.RouteUrl(Model.CompanyPageDatabaseModel.companyCode, new { Controller = MVC.services.Name, Action = MVC.services.ActionNames.page })

因此,没有正确传递companyCode值并正确形成链接。我不确定表单方法是如何或为什么发送回正确的页面,但是将URI设置为自身?

这是我的路线。

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            null,
            "{action}",
            new { controller = MVC.Home.Name, action = MVC.Home.ActionNames.Index },
            new { RootAction = new RootActionConstraint() }  // Route Constraint
        );

        routes.MapRoute(
            null, // Route name
            "{controller}/{action}", // URL with parameters
            new { controller = MVC.Home.Name, action = MVC.Home.ActionNames.Index }, // Parameter defaults
            new { controller = "Home|contact|franchise|form|resources|services|technology|community|careers|carriers|about" }
        );

        routes.MapRoute(
           null,
           "{companyCode}/{action}",
           new { controller = MVC.Home.Name, action = MVC.Home.ActionNames.Index },
           new { RootAction = new RootActionConstraint() }  // Route Constraint
       );

        routes.MapRoute(
            "jax",
            "{companyCode}/{controller}/{action}",
            new { controller = MVC.Home.Name, action = MVC.Home.ActionNames.Index }
        );

最后一条路线值是特许经营路线的一个例子。

此处还有视图中的表单代码:

        @using (Html.BeginForm("requestquote", "form", FormMethod.Post))
    {   }

有什么想法吗?

感谢。

编辑:在我的路线中添加。

1 个答案:

答案 0 :(得分:0)

有一个概念称为PRG,代表重定向后 - 获取

基本的想法是,您发布表单到您的应用程序。处理完输入后,您可以使用正确的网址重定向获取请求,而不是直接从提交内容向用户提供内容响应。

这有很多原因,但潜在的是关注点的分离。 (如果你没有分开关注点,那些奇怪的东西,比如所有链接可能会破坏你的页面......)

因此,您的解决方案是处理提交,如果无效,请将您的验证内容存储在TempData并返回RedirectToRouteResult(controller:"Home",action:"RequestQuote")

更新:我发现我读过的原始文章是为了学习这个概念。这是原始的ASP.NET MVC版本,但它应该大致相同。查看http://www.eworldui.net/blog/post/2008/05/ASPNET-MVC---Using-Post2c-Redirect2c-Get-Pattern.aspx