PartialViewResult возвращает представление с главной страницей - PullRequest
2 голосов
/ 26 января 2012

Я написал свой собственный атрибут HandleError.

Когда во время запроса ajax возникает ошибка, я хочу вернуть частичное представление, а когда запрос не является ajax, должно быть возвращено представление с главной страницей.

Пока я написал это

     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class IcpHandleErrorAttribute : FilterAttribute, IExceptionFilter
{
    private readonly Type _exceptionType = typeof(Exception);

    public IcpHandleErrorAttribute()
    {} 

    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)throw new ArgumentNullException("filterContext");

        if (filterContext.IsChildAction)return;

        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)return;

        Exception exception = filterContext.Exception;

        if (new HttpException(null, exception).GetHttpCode() != 500)return;

        if (!_exceptionType.IsInstanceOfType(exception))return;

        var controllerName = (string)filterContext.RouteData.Values["controller"];
        var actionName = (string)filterContext.RouteData.Values["action"];

        var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

        ViewResultBase result;

        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            result = new PartialViewResult { ViewName = "ErrorAjax" };
        }
        else
        {
            result = new ViewResult{ViewName = "Error"}; 
        }

        result.ViewData = new ViewDataDictionary<HandleErrorInfo>(model);
        result.TempData = filterContext.Controller.TempData;

        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = 500;

        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }
}

Но мастер-страница возвращается, даже когда PartialViewResult назначен результату.Почему это происходит?

Частичное представление ErrorAjax

@model HandleErrorInfo

@{
    Layout = null;
}

<div class="error">@Model.Exception.Message</div>

Действие вызывается через сообщение jquery.

Метод действия - это тестовый пример

[HttpPost]
public ActionResult Create(ProjectCreateCommand command)
{
    throw new NotImplementedException("ajax");

    return Post(command);
}

Регистрация атрибута в методе global.asax Application_Start ().

    GlobalFilters.Filters.Add(new IcpHandleErrorAttribute());

    RegisterGlobalFilters(GlobalFilters.Filters);

Ответы [ 2 ]

1 голос
/ 26 января 2012

Похоже, вы ничего не делаете с локальной переменной result, например, присваиваете ее контексту фильтра:

filterContext.Result = result;
0 голосов
/ 26 января 2012

Если это не Ajax-запрос, вам нужно перенаправить на какое-нибудь действие.И в этом действии вернуть View ()

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