ASP.NET MVC3 Прекратить выполнение действия / контроллера в пользовательском AuthorizeAttribute - PullRequest
5 голосов
/ 19 июля 2011

Как я могу прекратить выполнение действия / контроллера без перенаправления и вернуть только Response с statusCode

public class MainAuthorizationFilter : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        ... [my Authorization login] ...

        if([Authorization fail])
        {
             if (filterContext.HttpContext.Request.IsAjaxRequest())
             {
                 filterContext.HttpContext.Response.StatusCode = 401;
                 // HERE I want stop executing action/controller because I want return only statusCode
             }
             else
             {
                  // In non-ajax request I just redirect me request and action/contoller isn't executed
                  filterContext.Result = new RedirectToRouteResult("Error", new RouteValueDictionary { { "errorCode", errorCode } });
             }
        }
    }

    base.OnAuthorization(filterContext);

}

[MainAuthorizationFilter]
public ActionResult CreateFolder(...)
{
   CreateFolder(...);
}

Ответы [ 2 ]

10 голосов
/ 19 июля 2011
filterContext.Result = new HttpStatusCodeResult(401, "String description here if you want");

HttpStatusCodeResult на MSDN

Обратите внимание, что модуль auth форм может перехватить это и преобразовать его в перенаправление на вашу страницу входа в систему - не уверен, что это относится и к запросам AJAX, я не пробовал ...

2 голосов
/ 19 июля 2011

Я бы просто закончил ответ так:

public class MainAuthorizationFilter : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        ... [my Authorization login] ...

        if([Authorization fail])
        {
             if (filterContext.HttpContext.Request.IsAjaxRequest())
             {
                 filterContext.HttpContext.Response.StatusCode = 403;
                 filterContext.HttpContext.Response.End();

             }
             else
             {
                  // In non-ajax request I just redirect me request and action/contoller isn't executed
                  filterContext.Result = new RedirectToRouteResult("Error", new RouteValueDictionary { { "errorCode", errorCode } });
             }
        }
    }

    base.OnAuthorization(filterContext);

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