【问题标题】:Wrong URI after Form Submit MVC 3 asp.NET表单提交 MVC 3 asp.NET 后 URI 错误
【发布时间】:2012-06-06 00:36:30
【问题描述】:

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

有什么想法吗?

谢谢。

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

【问题讨论】:

  • 你能分享你的操作方法“requestQuoteSubmit”的代码

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


【解决方案1】:

有一个概念称为 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

【讨论】:

  • 我想我在这里做错了什么。这是我现在正在尝试的: routes.MapRoute( "requestquote", "{action}", new { controller = MVC.Home.Name, action = MVC.Home.ActionNames.requestquote } );然后我的控制器返回: return RedirectToRoute("requestquote");获取正确的 URI 是否需要临时数据?使用它时我的 uri 是 domain.com/requestQuoteSubmit 它当然找不到。
  • 按顺序发布您的完整路由声明。由于它的模式和优先级,听起来您的声明可能会将所有内容发送到 requestquote 操作。
  • 在顶部编辑了我的帖子以包含它。在视图中的表单代码中也添加了。
  • @Nozoku,我想我们需要看看 RootActionConstraint 的作用以及控制器的操作
猜你喜欢
  • 2011-07-09
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多