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

时间:2009-06-14 01:36:14

标签: c# asp.net-mvc

我有一个登录页面。在我的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
);

4 个答案:

答案 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方法:

  • 接受ReturnURL作为参数
  • 执行Request.Form [“ReturnURL”]

从HTML表单中获取URL值。

答案 3 :(得分:0)

您是否尝试过使用内置的FormsAuthentications系统?

如果您可以使用它,则无需实现您描述的功能。

我没有在MVC中检查这个,但它应该有效:

FormsAuthentication.RedirectFromLoginPage(LogInAsUserName.Text, False)

FormsAuthentications - 4guysfromrolla