Asp.net MVC遇到问题,将querystring作为参数传递

cho*_*bo2 2 c# asp.net-mvc

我有一个登录页面.在我的web.config中,我设置了一个loginUrl,这样如果用户试图进入"授权"页面并且未经授权,他们将被重定向到登录页面.

现在我注意到,当发生这种情况并且用户从"授权"页面重定向时,他们被重定向的页面中的URL被附加到登录URL.

因此,当他们登录时,我可以使用它,我可以将它们发送回他们试图获得的页面.

这就是Url的样子:

HTTP://本地主机:2505/CMS_Account/LogOn支持RETURNURL =%2fCMS_Home%2fIndex

所以我试图将ReturnUrl查询字符串部分捕获为我的视图中的参数.

但我不能把它拿去工作.

所以我发现如果我更改我的表单以进行登录:

<% using (Html.BeginForm()) ........
Run Code Online (Sandbox Code Playgroud)

然后我可以捕获ReturnURl由于某种原因没有问题.

但是,我现在如何拥有它,我有这个:

<% using (Html.BeginForm("Login","Authentication",FormMethod.Post,new { id = "frm_Login"})) .....
Run Code Online (Sandbox Code Playgroud)

一旦我尝试将参数传递给BeginForm,它就会停止捕获ReturnUrl.

我不知道为什么会停止.有人说这是因为我使用的是默认路由,如果你没有在beingForm中放任何东西,它就会神奇地找出带有默认URL的ReturnUrl.

当你在BeginForm中放入一些东西时,它似乎变得愚蠢,你需要给它一个路径来告诉它该做什么.

我不知道怎么写这条路线.我尝试了很多不同的组合,它们都失败了,每个告诉我正确路线的人都不会告诉我它应该是什么样子.

所以我不知道该怎么办了.

我尝试了什么

routes.MapRoute(
   "CMS_Account",  // Route name
   "CMS_Account/{action}/{ReturnUrl}",  // URL with parameters
   new { controller = "CMS_Account", action = "LogOn",}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",  // Route name
   "CMS_Account/{action}/{ReturnUrl}",   // URL with parameters
   new { controller = "CMS_Account", action = "LogOn", ReturnUrl = ""}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",   // Route name
   "{controller}/{action}/{ReturnUrl}",  // URL with parameters
   new { controller = "CMS_Account", action = "LogOn", ReturnUrl = ""}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",   // Route name
   "{controller}/{action}/{id}",  // URL with parameters
   new { controller = "CMS_Account", action = "LogOn", id = ""}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",  // Route name
   "{controller}/{action}/", // URL with parameters
   new { controller = "CMS_Account", action = "LogOn"}  // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)

Cha*_*ino 6

您无需更改路线.路由引擎的一个很酷的事情是,如果你添加一个未在路由本身中声明的额外路由值,路由引擎将把它作为get变量抛到最后.

例如,您是否尝试将ReturnUrl放入BeginFrom?

控制人丹尼斯建议:

public ActionResult LogOn(string ReturnURL) {
    ViewData["ReturnURL"] = ReturnURL;
    return View();
}
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您将需要使用BeginForm(字符串操作,字符串控制器,对象routeValues,FormMethod方法,对象htmlAttributes)重载.例如

Html.BeginForm("Login",
               "Authentication",
               new { @returnUrl = ViewData["ReturnUrl"] },
               FormMethod.Post,
               new { @id = "frm_Login" })
Run Code Online (Sandbox Code Playgroud)

HTHs,查尔斯

编辑:只是旁注,另一种方法是将ReturnUrl放入一个隐藏的输入字段 - 初始从查询字符串获取后.这意味着该值在您的帖子集合中,您不必担心将其恢复到您的查询字符串中.