1

我的 AccountController 上的 Login Action 使用Ε Г И І И ОRedirect to Post Method/Action中提到的技术向我的 StatusController 的 Success Action 发布“登录成功”消息:

/// <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 目录中找到一个成功视图?

4

2 回答 2

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);
}
于 2013-06-01T19:57:43.797 回答
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);
      }
   }
}
于 2013-06-01T20:16:47.050 回答