0

我对这里的一些事情有点困惑。我有一个表格,该表格的 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))
    {   }

有任何想法吗?

谢谢。

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

4

1 回答 1

0

有一个概念称为 PRG,它代表Post-Redirect-Get

基本思想是您将表单发布到您的应用程序。处理完输入后,您将重定向到正确 URL 处的Get请求,而不是直接从提交中为用户提供内容响应。

这有很多原因,但根本原因是关注点分离。(如果您不区分关注点,就会发生奇怪的事情,例如您页面上的所有链接都可能中断......)

因此,您的解决方案是处理提交,如果无效,则将您的验证内容存储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

于 2012-06-06T07:08:31.183 回答