Я работаю над приложением, которое использует MVC как основу с knockoutjs. Ajax звонки поступают в ApiController для предоставления моделей для страниц и т. Д. Сайт работает как мастер, так что пользователь приземляется на первой странице и продвигается по третьей странице, где происходит оплата.
Я хочу знать, есть ли хороший чистый способ гарантировать, что посадка на любой странице без наличия определенной переменной в сеансе вызовет появление RedirectToAction("","Home").
На данный момент в apicontroller я просто задание сеанса var и проверка его на каждой последующей странице. Если он существует, я разрешаю отображение страницы. Если нет, я перенаправляюсь в Home. На странице «Спасибо за покупку» я очищаю все сеансовые вары.
Вот логика, которая должна быть на КАЖДОМ контроллере, а сеансовые вары должны быть последовательными, что, похоже, запах кода.
public ActionResult Index()
{
FoundationFundsModel request = ControllerContext.HttpContext.Session["FoundationFund"] as FoundationFundsModel;
if (request == null)
{
return this.RedirectToAction("", "Donate");
}
PaymentPageModel model = new PaymentPageModel().WithDefaults();
return View(model);
}
Как я могу выполнить эту задачу, не используя кучу сессионных vars и ActionResult на контроллере каждой страницы?
Я хотел убедиться, что я поделился результатом, который я нашел
namespace Foundation.Website.Filters
{
public class RedirectToHome : ActionFilterAttribute
{
/*
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
//You may fetch data from database here
base.OnResultExecuting(filterContext);
}
*/
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controllerName = filterContext.RouteData.Values["controller"];
var actionName = filterContext.RouteData.Values["action"];
// This is incomplete, but demonstrates a working example
if ((string) controllerName != "Foundation")
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Foundation",
action = "Index"
}));
}
Вы можете сделать что-то вроде этого
public class BaseController : Controller
{
public new string Request { get; set; }
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
Request = requestContext.HttpContext.Session["FoundationFund"].ToString();
}
}
И теперь наследуйте другие контроллеры от этого базового контроллера и свойства запроса доступа
public ActionResult Index()
{
if(Request==null)
return View();
}