Есть ли способ создать что-то вроде глобального индекса ActionResult () для всех контроллеров?

Я работаю над приложением, которое использует 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 на контроллере каждой страницы?

0
задан 13 August 2018 в 15:20

2 ответа

Я хотел убедиться, что я поделился результатом, который я нашел

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"
        }));
      }
1
ответ дан 15 August 2018 в 17:01

Вы можете сделать что-то вроде этого

 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();
    }
0
ответ дан 15 August 2018 в 17:01

Другие вопросы по тегам:

Похожие вопросы: