我的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目录中找到成功视图?
答案 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);
}
}
}