我有一个登录页面。在我的web.config中,我设置了一个loginUrl,这样如果用户试图进入“授权”页面并且未经授权,他们将被重定向到登录页面。
现在我注意到,当发生这种情况并且用户从“授权”页面重定向时,他们被重定向的页面中的URL被附加到登录URL。
因此,当他们登录时,我可以使用它,我可以将它们发送回他们试图获得的页面。
这就是Url看起来的样子:
http://localhost:2505/CMS_Account/LogOn?ReturnUrl=%2fCMS_Home%2fIndex
所以我试图将ReturnUrl查询字符串部分捕获为我视图中的参数。
但我无法接受它的工作。
所以我发现如果我将表单更改为登录:
<% using (Html.BeginForm()) ........
然后我可以捕获ReturnURl因某些原因没问题。
但是我现在如何拥有它:
<% using (Html.BeginForm("Login","Authentication",FormMethod.Post,new { id = "frm_Login"})) .....
一旦我尝试将参数传递给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
);
答案 0 :(得分:6)
您无需更改路线。路由引擎很酷的一点是,如果你添加一个未在路由本身中声明的额外路由值,路由引擎会将它作为get变量抛出到最后。
E.g。您是否尝试将ReturnUrl放入BeginFrom?
丹尼斯建议的控制人员:
public ActionResult LogOn(string ReturnURL) {
ViewData["ReturnURL"] = ReturnURL;
return View();
}
然后在您的视图中,您将需要使用BeginForm(字符串操作,字符串控制器,对象routeValues,FormMethod方法,对象htmlAttributes)重载。 E.g。
Html.BeginForm("Login",
"Authentication",
new { @returnUrl = ViewData["ReturnUrl"] },
FormMethod.Post,
new { @id = "frm_Login" })
HTHS, 查尔斯
编辑:只是在旁注,另一种方法是将ReturnUrl放入隐藏的输入字段 - 在初始从查询字符串获取后。这意味着该值在您的帖子集合中,您不必担心将其恢复到您的查询字符串中。
答案 1 :(得分:3)
您无需改变路线。
获取ReturnURL参数(或任何其他查询字符串参数)的最简单方法是将其添加到LogOn
操作中,如下所示:
public ActionResult LogOn(string ReturnURL) {
ViewData["ReturnURL"] = ReturnURL;
return View();
}
答案 2 :(得分:1)
当您在“当前”状态下配置表单时,您强制它进行POST,但是您想要的数据位于查询字符串中。
您可以使用ControllerContext.HttpContext.Request.Querystring["ReturnURL"]
...或
将ReturnURL添加为表单中的隐藏字段,并确保您要发布到的Logon方法:
从HTML表单中获取URL值。
答案 3 :(得分:0)
您是否尝试过使用内置的FormsAuthentications系统?
如果您可以使用它,则无需实现您描述的功能。
我没有在MVC中检查这个,但它应该有效:
FormsAuthentication.RedirectFromLoginPage(LogInAsUserName.Text, False)