我对此处的某些事情感到有些困惑。我有一个表单,该表单的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))
{ }
有什么想法吗?
感谢。
编辑:在我的路线中添加。
答案 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