Как перенаправить пользователя на другое действие контроллера из фильтра действий ASP.MVC 3?

Как создать собственный фильтр действий ASP.MVC 3, как мне перенаправить пользователя на другое действие, если мой тест не пройден? Я хотел бы передать исходное действие, чтобы можно было перенаправить обратно на исходную страницу после того, как пользователь введет отсутствующее предпочтение.

В контроллере:

[FooRequired]
public ActionResult Index()
{
    // do something that requires foo
}

в пользовательском классе фильтра:

// 1. Do I need to inherit ActionFilterAttribute or implement IActionFilter?
public class FooRequired : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (TestForFoo() == false)
        {
            // 2. How do I get the current called action?

            // 3. How do I redirect to a different action,
            // and pass along current action so that I can
            // redirect back here afterwards?
        }

        // 4. Do I need to call this? (I saw this part in an example)
        base.OnActionExecuting(filterContext);            
    }
}

Я ищу простой пример фильтра ASP.MVC 3. Пока что мой поиск привел к примерам Ruby on Rails или фильтрам ASP.MVC, гораздо более сложным, чем мне нужно. Я прошу прощения, если это было задано ранее.

2 ответа

Решение

Вы можете установить filterContext.Result к RedirectToRouteResult:

filterContext.Result = new RedirectToRouteResult(...);

Вот небольшой пример кода с использованием одного из моих собственных фильтров Redirect:

public class PrelaunchModeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //If we're not actively directing traffic to the site...
        if (ConfigurationManager.AppSettings["PrelaunchMode"].Equals("true"))
        {
            var routeDictionary = new RouteValueDictionary {{"action", "Index"}, {"controller", "ComingSoon"}};

            filterContext.Result = new RedirectToRouteResult(routeDictionary);
        }
    }
}

Если вы хотите перехватить маршрут, вы можете получить его от члена ActionExecutingContext.RouteData.

С этим участником RouteData вы можете получить исходный маршрут:

var currentRoute = filterContext.RouteData.Route;

И т.д.... Это поможет ответить на ваш вопрос?

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