2012-01-20 75 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

正如你所看到的,這是標準的由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,請檢查我對視圖所說的話。哦,並確保您的網址編碼爲ReturnUrl

另外,由於它是HttpPost,查詢字符串將不會有返回Url。