Изменение вида в ASP.NET MVC Filter - PullRequest
6 голосов
/ 30 мая 2011

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

Я полагаю, что это перенаправление должно произойти в OnActionExecuted, однако filterContext не содержит информации о представлении - оно, однако, в OnResultExecuted, но к этому времени я считаю, что уже слишком поздно менять представление.

Как перехватить имя представления и изменить ViewResult?

Это то, что я выполнил в результате и что мне хотелось бы, чтобы работа выполнялась в действии.

public class MobilePageFilter : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if(filterContext.Result is ViewResult)
        {
            if (isMobileSite(filterContext.HttpContext.Session[SetMobile.SESSION_USE_MOBILE]))
            {
                ViewResult viewResult = (ViewResult)filterContext.Result;

                string viewName = viewResult.ViewName;
                filterContext.Result = new ViewResult
                {
                    ViewName = "Mobile/" + viewName,
                    ViewData = viewResult.ViewData,
                    TempData = viewResult.TempData
                };
            }
        }

        base.OnResultExecuted(filterContext);
    }
}

Ответы [ 2 ]

4 голосов
/ 14 декабря 2011

Это то, что я в итоге сделал, и заключил его в многократно используемый атрибут, и самое главное, он сохраняет исходный URL при перенаправлении (или применении любого желаемого результата) в зависимости от ваших требований:

public class AuthoriseSiteAccessAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        // Perform your condition, or straight result assignment here.
        // For me I had to test the existance of a cookie.
        if (yourConditionHere)
            filterContext.Result = new SiteAccessDeniedResult();
    }

}

public class SiteAccessDeniedResult : ViewResult
{
    public SiteAccessDeniedResult()
    {
        ViewName = "~/Views/SiteAccess/Login.cshtml";
    }
}

Затем просто добавьте атрибут [SiteAccessAuthorise] к своим контроллерам, к которым вы хотите применить авторизационный доступ (в моем случае), или добавьте его в BaseController.Убедитесь, что хотя действие, которое вы перенаправляете на базовый контроллер, не имеет атрибута, иначе вы попадете в бесконечный цикл!

4 голосов
/ 31 мая 2011

Я бы порекомендовал вам следующую запись в блоге , которая объясняет лучшую альтернативу для достижения того, о чем вы просите, вместо использования фильтров действий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...