2010-02-15 56 views
5

控制器之間的信息這是How to RedirectToAction in ASP.NET MVC without losing request data傳遞在ASP.Net MVC的


喜重複的,我進入這讓我抓我的頭有點問題。基本上我有一個登錄頁面Login.aspx,其中有用戶名和密碼字段,以及一個重要的小複選框。登錄在AccountController Login方法中處理。代碼目前如下:

[AcceptVerbs(HttpVerbs.Post)] 
[SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", 
    Justification = 
     "Needs to take same parameter type as Controller.Redirect()")] 
public ActionResult LogOn(string userName, string password, string returnUrl, 
    bool sendStoredInfo) 
{ 
    if (!this.ValidateLogOn(userName, password)) { 
     return View(); 
    } 

    this.FormsAuth.SignIn(userName, false); 

    if (!String.IsNullOrEmpty(returnUrl)) { 
     return Redirect(returnUrl); 
    } else { 
     return RedirectToAction("Index", "Home"); 
    } 
} 

基本上,如果行返回重定向(returnUrl);那麼它會在另一個控制器OpenIDController中結束,這就是sendStoredInfo布爾變得重要的情況。但問題是我在OpenIDController中時沒有提及它。我怎樣才能發送這個值?

回答

11

更改呼叫:

return RedirectToAction("LoginFailed", new { sendFlag = sendStoredInfo }); 

的控制器操作方法簽名可能是這樣的:

public ActionResult LoginFailed(bool sendFlag) 
{ 
    ... 
} 
1

由於重定向的性質,您只能執行GET操作。

這意味着您必須將該參數作爲查詢字符串的一部分傳遞。

所以,你會重定向到URL像http://host/dir/page?sendStoredInfo=true

然後,您可以選擇將它在其他控制器的方法簽名的一部分,或者,你可以選擇直接使用訪問的HttpRequest被曝光用於操作的HttpContext。

您也可以撥打RedirectToAction,按照這個先前的問題:

How to RedirectToAction in ASP.NET MVC without losing request data

13

另外考慮使用TempD ata將數據從控制器傳遞到控制器。這可能是有利的,因爲您不必將bool sendFlag接口潛在地暴露給用戶。

碼在第一控制器:

TempData["sendFlag"] = sendStoredInfo; 
return RedirectToAction("LoginFailed"); 

碼在第二控制器:

public ActionResult LoginFailed() 
{ 
    bool sendFlag = TempData.ContainsKey("sendFlag")? TempData["sendFlag"]: false; 
} 
+0

謝謝Jace Rhea,我已經提出了修改建議。 – 2015-02-11 19:34:33

+0

爲什麼這個布爾sendFlag = TempData.ContainsKey(「sendFlag」)? TempData [「sendFlag」]:false;會拋出一個異常說「對象空引用」? – Umitk 2015-08-27 03:30:12

+1

TempData爲空? – 2015-10-05 22:19:09

1

至於我的知識所及,四種不同的方法存在是爲了處理在控制器之間傳遞數據asp.net MVC。它們是1. ViewData 2. ViewBag 3. TempData和4.會話。如果你可能喜歡比較好的解釋,除了一個可下載的樣本,請看看here