2009-06-14 130 views
2

我有一个登录页面。在我的web.config中,我设置了一个loginUrl,以便如果用户尝试访问“授权”页面并且未被授权,他们将被重定向到登录页面。Asp.net MVC在查询字符串中传递参数时遇到问题

现在我注意到,发生这种情况时,用户从“授权”页面重定向,他们从重定向页面中的网址获取追加到登录网址。

这样,当他们进行登录时,我可以使用它,我可以将它们发送回他们试图获取的页面。

所以这是地址是什么样子:

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 
); 

回答

6

你不需要改变你的路线。路由引擎很酷的事情是,如果你添加一个没有在路由本身中声明的额外路由值,路由引擎将把它作为一个get变量放在最后。

E.g.你有没有尝试将ReturnUrl放入BeginFrom?

控制器丹尼斯建议:

public ActionResult LogOn(string ReturnURL) { 
    ViewData["ReturnURL"] = ReturnURL; 
    return View(); 
} 

然后在您的视图,您需要使用BeginForm(串动,串控制器,对象routeValues,FormMethod方法,对象htmlAttributes)超载。例如。

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

HTHS, 查尔斯

编辑:只是在一个侧面说明,它周围的其他方法是把RETURNURL到一个隐藏输入字段 - 从最初的查询字符串得到它之后。这意味着该值在您的后期收藏中,您不必担心将其重新放回您的查询字符串中。

1

如果要配置的形式在“当前”的状态,你是迫使它POST,但是你想要的数据是在查询字符串。

您可以用ControllerContext.HttpContext.Request.Querystring["ReturnURL"]

或访问...

添加RETURNURL作为形式的隐藏字段,并确保您的登录方法,你将发布到之一:

  • 接受ReturnURL作为参数
  • 执行请求。表单[“ReturnURL”]

从HTML表单中获取URL值。

+0

嗯IC I有2个的ActionResult方法之一是: //公众的ActionResult登录() // {// 返回查看(); //} then another actionResult with same name,but it has [AcceptVerbs(HttpVerbs.Post)],所以我注释掉了上面的一个,并拿走了Post,它现在可以工作。 我不明白为什么如果你使用强制一个POST它不能抓住查询字符串,但在同一时间,如果我离开没有参数的形式,并有我离开它的一切(即有Post属性的方法)。 它工作得很好。 – chobo2 2009-06-14 11:34:27

+0

所以没有办法解决这个问题?其他然后你发布它只是看起来很愚蠢,他们只是让方式只允许帖子和东西,但如果你指定它是这样的 <%使用(Html.BeginForm(“登录”,“身份验证”,FormMethod.Post, new {id =“frm_Login”}))..... 它突然间想不出来。但是如果BeginForm是空白的,它会以某种方式找到标记为“Post”的ActionResult并仍然获取ReturnUrl。 然后我不能相信这不像是我读过的书或者像这样的教程对我来说看起来像是很多人会做的事情。 – chobo2 2009-06-14 11:38:43

+0

我其实没有明确指出这些东西的优点是什么? 就像为什么麻烦写了所有额外的东西,像我写的? <%使用(Html.BeginForm(“Login”,“Authentication”,FormMethod.Post,new {id =“frm_Login”}))..... 其他那么也许如果你想给它一个“ ID“或什么的。 看起来像留下空白让你更多的好处,你仍然可以标签ActionResults“发布”或“获取”,它仍然可以找到它。 PS这个字符的限制真的是同性恋....... – chobo2 2009-06-14 11:40:48

3

你不需要改变你的路线。

得到RETURNURL参数(或任何其他的查询字符串参数)最简单的方法是将其添加到您的LogOn行动,像这样:

public ActionResult LogOn(string ReturnURL) { 
    ViewData["ReturnURL"] = ReturnURL; 
    return View(); 
} 
0

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

如果你可以使用它,你不必实现你描述的功能。

我没有MVC检查这一点,但它应该工作:

FormsAuthentication.RedirectFromLoginPage(LogInAsUserName.Text, False) 

FormsAuthentications - 4guysfromrolla

相关问题