发布
社区首页 >问答首页 >在将查询字符串作为参数传递给Asp.net MVC时遇到问题

在将查询字符串作为参数传递给Asp.net MVC时遇到问题
EN

Stack Overflow用户
提问于 2009-06-14 01:36:14
回答 4查看 4.1K关注 0票数 2

我有一个登录页面。在我的web.config中,我设置了一个loginUrl,这样如果用户试图转到一个“已授权”页面而没有获得授权,他们将被重定向到登录页面。

现在我注意到,当这种情况发生时,用户从“授权”页面被重定向,来自他们被重定向的页面的url被附加到登录url。

这样,当他们登录时,我可以使用,我可以将他们发送回他们试图得到的页面。

所以Url看起来是这样的:

http://localhost:2505/CMS_Account/LogOn?ReturnUrl=%2fCMS_Home%2fIndex

因此,我尝试在我的视图中捕获ReturnUrl查询字符串部分作为参数。

但我不能让它花时间工作。

因此,我发现如果我将登录表单更改为以下内容:

代码语言:javascript
代码运行次数:0
复制
<% using (Html.BeginForm()) ........

然后,我可以出于某种原因捕获ReturnURl,没有问题。

然而,我现在拥有它的方式是这样的:

代码语言:javascript
代码运行次数:0
复制
<% using (Html.BeginForm("Login","Authentication",FormMethod.Post,new { id = "frm_Login"})) .....

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

我不知道它为什么会停下来。有些人说,这是因为我使用的是默认路由,不知何故,如果你不在beingForm中放任何东西,它就能神奇地用默认url识别出ReturnUrl。

一旦你把一些东西放到BeginForm中,它就会变得愚蠢,你需要给它一条路由来告诉它该做什么。

不过,我不知道如何写这条路线。我尝试了许多不同的组合,但都失败了,每个告诉我正确路线的人都不会告诉我它应该是什么样子的。

所以我不知道该怎么做了。

我尝试过的

代码语言:javascript
代码运行次数:0
复制
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
);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-14 21:56:31

你不需要改变你的路线。路由引擎最酷的地方在于,如果您添加了一个没有在路由本身中声明的额外路由值,那么路由引擎将把它作为get变量抛出到最后。

例如,你有没有试过把ReturnUrl放入BeginFrom?

Dennis建议的控制器:

代码语言:javascript
代码运行次数:0
复制
public ActionResult LogOn(string ReturnURL) {
    ViewData["ReturnURL"] = ReturnURL;
    return View();
}

然后在您的视图中,您将需要使用BeginForm(string操作、string控制器、object routeValues、FormMethod方法、object htmlAttributes)重载。例如。

代码语言:javascript
代码运行次数:0
复制
Html.BeginForm("Login",
               "Authentication",
               new { @returnUrl = ViewData["ReturnUrl"] },
               FormMethod.Post,
               new { @id = "frm_Login" })

查尔斯哈斯

编辑:顺便说一句,另一种方法是将ReturnUrl放入一个隐藏的输入字段中-在最初从查询字符串中获取它之后。这意味着值就在您的post集合中,您不必担心如何将其返回到querystring中。

票数 6
EN

Stack Overflow用户

发布于 2009-06-14 02:39:26

你不需要改变你的路线。

获取ReturnURL参数(或任何其他查询字符串参数)的最简单方法是将其添加到LogOn操作中,如下所示:

代码语言:javascript
代码运行次数:0
复制
public ActionResult LogOn(string ReturnURL) {
    ViewData["ReturnURL"] = ReturnURL;
    return View();
}
票数 3
EN

Stack Overflow用户

发布于 2009-06-14 01:58:29

当你在“当前”状态下配置表单时,你是在强制它发布,但是你想要的数据在查询字符串上。

您可以使用ControllerContext.HttpContext.Request.Querystring["ReturnURL"]访问它

或者..。

将ReturnURL作为隐藏字段添加到表单中,并确保您将发布到以下位置的登录方法:

作为parameter

  • Performs a Request.Form"ReturnURL"

  • 接受ReturnURL

从HTML表单获取URL值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/991936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档