如何在调用另一个控制器的后期操作时渲染正确的视图

时间:2013-06-01 19:53:43

标签: asp.net-mvc

我的AccountController上的登录操作使用Ε Г И І И О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 个答案:

答案 0 :(得分:2)

您应该将重定向作为响应返回,而不是尝试在控制器实例上调用该方法。

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

答案 1 :(得分: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);
      }
   }
}