2013-06-01 144 views
1

一個登錄行動對我的AccountController的POST操作時渲染正確的觀點使用由Ε Г И І И ОRedirect to Post Method/Action提到的技術來發布「登錄成功」消息給我StatusController的成功操作:如何調用另一個控制器

/// <returns> 
/// If login is successful, returns a view stating such. If the 
/// login is not successful, the main Login view will be 
/// redisplayed 
/// </returns> 
[HttpPost] 
public ActionResult Login(logIn loginAttempt) 
{ 
    logIn theLoginModel = new logIn(); 

    string username = loginAttempt.Username; 
    string password = loginAttempt.Password; 
    if (Membership.ValidateUser(username, password)) {  
     ... 

     /* The login was successful. Redirect to the LoginSucess 
     * Action success */ 
     status theStatus = new status(); 
     theStatus.Message = Constants.StatusMsgs.LoginSuccess; 
     StatusController SC = new StatusController(); 
     return SC.Success(theStatus);    
    } else { 
     ... 
     return View(theLoginModel); 
    }     
}   

我可以使用VS2010調試器來驗證我的成功操作獲取的代碼片段的正確消息:

namespace usedCarLotWebApp.Controllers 
{ 
    public class StatusController : Controller 
    { 
     /// <summary> 
     /// Outputs a Success status message to the user 
     /// </summary> 
     /// <returns> 
     /// A trivial view to display a Success status message to the 
     /// user 
     /// </returns> 
     [HttpPost] 
     public ActionResult Success(status theMessage) 
     { 
     return View(viewName: "Success", model: theMessage); 
     } 
    } 
} 

但是當成功操作我的狀態的控制器嘗試呈現視圖,它會嘗試從我的AccountController目錄而不是我的StatusController目錄呈現一個視圖,因爲我期望。

有什麼方法可以修改我的StatusController的成功操作,以便它總是試圖在我的StatusController目錄中找到成功視圖?

回答

2

TempData是要走的路。 TempData是一個集合,它存儲值直到下一個請求。當您重定向時,您直接轉到下一個請求,從TempData中檢索值。我一直都在傳遞狀態消息。

我會做這樣的:

[HttpPost] 
public ActionResult Login(logIn loginAttempt) 
{ 
    logIn theLoginModel = new logIn(); 

    string username = loginAttempt.Username; 
    string password = loginAttempt.Password; 
    if (Membership.ValidateUser(username, password)) {  
     TempData["Message"] = theMessage; 
     return RedirectToAction("Success", "Status");  
    } else { 
     ... 
     return View(theLoginModel); 
    }     
} 

狀態控制器(請注意status theMessage從動作頭消失了,因爲它是在TempData傳遞)。 Success也成爲GET消息:

namespace usedCarLotWebApp.Controllers 
{ 
    public class StatusController : Controller 
    { 
     [HttpGet] 
     public ActionResult Success() 
     { 
     var theMessage = (theMessageType) TempData["Message"]; 
     return View(viewName: "Success", model: theMessage); 
     } 
    } 
} 
3

您應該返回重定向作爲響應,而不是嘗試調用控制器實例上的方法。

return RedirectToAction("Success", "Status") 

return RedirectToAction("Success", "Status", new { theMessage = Constants.StatusMsgs.LoginSuccess}) 

你也可以發送成功操作參數。

//[HttpPost] You don't need this 
public ActionResult Success() 
{ 
    return View("Success",Constants.StatusMsgs.LoginSuccess); 
} 
+0

如果我這樣做,是有辦法,我可以* *後我的狀態對象,而不是通過URL參數傳遞給它?注意:LoginSuccess項目將不會保持不變。 –

+0

@ShawnEary是的,你仍然可以通過它作爲參數。看看RedirectToAction重載。 –

+0

@ShawnEary我沒注意到theMessage參數有一個自定義類型。如果狀態類型具有默認構造函數和公共屬性,則模型聯編程序應該能夠將其發送到查詢字符串中。 –

相關問題