2012-01-20 2 views
2

У меня есть, вероятно, очень глупый вопрос, но у меня все равно.MVC 3 перенаправление ReturnUrl не работает

Вот код в мой контроллер для входа в

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

Как вы можете видеть, я просто проверить, если ReturnUrl имеет длину для целей тестирования, прежде чем я заблокировать его больше. Моя проблема в том, что я получаю ссылку на объект, не установленную на экземпляр объекта. указывая на эту линию «если (ReturnUrl.Length> 1)»

Теперь URL у меня есть, когда пользователь истек с сайта это: http://localhost/Dispatch2012/Staff/Home?ReturnUrl=Dispatch2012%2FStaff%2FCredential

Как вы можете видеть, это стандарт redirect, созданный 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); 
    } 

несколько вещей:

  1. Ваши returnUrl нужно проверить, чтобы убедиться, что это Локальный URL. Существует несколько способов сделать это, и поскольку вы используете ASP.NET MVC 3, it's built in.

  2. Почему вы вытаскиваете ReturnUrl из строки запроса, когда (если вы правильно настроили свое мнение), он уже прошел?

У вас есть на ваш взгляд?

<%= Html.Hidden("returnUrl", Url.Encode(Url.Action("ActionToRedirectTo", "ControllerName", new { id = Model.Whatever}))) %> 

Если да, то когда это сообщение, оно будет автоматически отправлено в Index действий в качестве параметра returnUrl.

Я держу пари, так как он не работает, вы фактически не отправляете ReturnUrl правильно, проверьте, что я сказал о представлении. О, и убедитесь, что вы кодируете URL-адрес ReturnUrl.

Кроме того, поскольку это HttpPost, в запросе не будет указателя возврата.

Смежные вопросы