我有一个登录页面.在我的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)
您无需更改路线.路由引擎的一个很酷的事情是,如果你添加一个未在路由本身中声明的额外路由值,路由引擎将把它作为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放入一个隐藏的输入字段 - 初始从查询字符串获取后.这意味着该值在您的帖子集合中,您不必担心将其恢复到您的查询字符串中.
归档时间: |
|
查看次数: |
3953 次 |
最近记录: |