(这是一个更狭隘的问题)
在我的asp.net MVC操作中,我正在查看ReturnUrl值是否在URL中。
我的网址看起来像这样:
http://localhost:56112/user/login?ReturnUrl=/user/settings
在我的操作中,我正在查看是否存在查询字符串值,并且它返回NULL?怎么会这样?
代码:
if(Request.QueryString["ReturnUrl"] != null)
{
}
遍历应用程序,它只是跳过if语句的主体,即它是NULL。
如何解释?
更新
在检查用户是否已登录的控制器中,我有一个看起来像的ActionFilter:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
// some stuff
string loginUrl = FormsAuthentication.LoginUrl + "/user/settings;
context.Response.Redirect(loginUrl);
}
答案 0 :(得分:3)
尝试调试代码 - 您应该能够在调试器中看到整个QueryString参数列表,这样您就可以看到是否错过了拼写代码。
答案 1 :(得分:2)
我自己遇到了类似的问题。
Request.RawUrl是正确的,提交给浏览器的url缺少QueryString。检查页面的“查看源”,并验证表单元素的action属性上的URL。您可能会发现缺少QueryString。
可能发生的是你正在使用带有routeValues参数的@ Html.BeginForm重载。使用“routeValues”的任何重载将生成新的路由URL并删除任何查询字符串参数。在我的例子中,我想添加enctype属性,唯一的重载需要指定routeValues。我想这是对MVC 3的疏忽。
但是,您仍然可以用老式的方式编写自己的表单标记。查看MVC 3的源代码,看来Html.BeginForm的基本重载使用了Request.RawUrl。
尝试以下方法:
<form action="@Request.RawUrl" method="post" enctype="multipart/form-data">
答案 2 :(得分:1)
我自己遇到了这个问题,在确定最佳解决方案时遇到了一些困难,因此我想在对话中加入我的简短经验。
在调试模式下,我向下滚动了Request的所有属性;就我而言,我在HttpContext.Request.UrlReferrer.Query
中找到了要查询的QueryString值。原因似乎是我从拥有该QueryString值的页面上单击了Html.ActionLink
,并将我推到了MVC ActionResult
处理程序-从技术上讲,这是单独的页面(具有自己新定义的HttpContext
),即使您在调试时在浏览器的URL中没有这样表示。
进一步的研究似乎表明,微软针对此问题的首选解决方案是在调用处理程序时将价值传递给链...但是,实现这一目标的语法可能并不像应该清楚。取而代之的是,即使需要花费一到两行额外的代码来达到您的价值,从UrlReferrer
解析您的价值似乎也可以正常工作。例如,在QueryString上传递单个值的最基本的情况可能是这样的:
String query = HttpContext.Request.UrlReferrer.Query;
String myValue = query.Split('=')[1];