我有一个非常愚蠢的问题,但无论如何我都会有。
以下是我的控制器中用于登录的代码
[HttpPost]
public ActionResult Index(LogonModel model, string ReturnUrl)
{
ReturnUrl = Request.QueryString["ReturnUrl"];
if (ModelState.IsValid)
{
if (UserRepository.validLogin(model.Username, model.Password))
{
UserLogRepository.createLogEntry("Log On", " has logged on to the Staff Portal.", "Entry/Exit");
if (ReturnUrl.Length > 1)
{
return Redirect(Request.QueryString["ReturnUrl"]);
}
else
{
return RedirectToAction("Dashboard", "Home");
}
}
else
{
ModelState.AddModelError("", Session["Error"].ToString());
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
正如你所看到的那样,我只是在检查返回器是否有一个用于测试目的的长度之后再将其锁定。我的问题是我得到一个“对象引用未设置为对象的实例”。指向这一行“if(ReturnUrl.Length> 1)”
现在,当用户从网站超时时,我所拥有的URL是: http://localhost/Dispatch2012/Staff/Home?ReturnUrl=Dispatch2012%2FStaff%2FCredential
正如您所看到的,这是MVC 3创建的标准重定向,我尝试将ReturnUrl作为标准查询字符串读取,但每次都表示该对象不存在。我错过了什么?
答案 0 :(得分:5)
控制器的设置方式对我来说很奇怪,但让我们深入研究它:
[HttpPost]
public ActionResult Index(LogonModel model, string returnUrl) //changed
{
ReturnUrl = returnUrl; //changed
if (ModelState.IsValid)
{
if (UserRepository.validLogin(model.Username, model.Password))
{
UserLogRepository.createLogEntry("Log On", string.Format("{0} has logged on to the Staff Portal.", model.Username, "Entry/Exit"); //changed
if (ReturnUrl.Length > 1) //this should use IsLocalUrl
{
return Redirect(Request.QueryString["ReturnUrl"]);
}
else
{
return RedirectToAction("Dashboard", "Home");
}
}
else
{
ModelState.AddModelError("", Session["Error"].ToString());
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
一些事情:
您需要检查returnUrl
以确保它是本地网址。有很多方法可以做到这一点,因为你使用的是ASP.NET MVC 3,it's built in。
为什么你把ReturnUrl从查询字符串中拉出来(如果你正确设置了你的视图),它已经被传入了?
您认为以下是否有以下内容?
<%= Html.Hidden("returnUrl", Url.Encode(Url.Action("ActionToRedirectTo", "ControllerName", new { id = Model.Whatever}))) %>
如果是这样,当它发布时,它会自动作为Index
参数发送到returnUrl
操作。
我打赌因为它不起作用,你实际上并没有正确地发回ReturnUrl,检查我对视图的看法。哦,确保你的网址是ReturnUrl
。
此外,由于它是HttpPost
,因此查询字符串中不会包含返回的Url。