【问题标题】:PartialViewResult is returning view with master pagePartialViewResult 正在返回带有母版页的视图
【发布时间】:2012-01-26 08:55:19
【问题描述】:

我编写了自己的 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的post调用的。

action 方法是一个测试用例

[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);

【问题讨论】:

  • 能否请您显示您的自定义 HandleError 属性的完整代码以及您在哪里/如何注册它?
  • 我添加了完整的代码。它是发货代码的副本,但略有修改。
  • 试试这个链接可能会有所帮助stackoverflow.com/questions/3651171/…>

标签: asp.net-mvc


【解决方案1】:

您似乎没有对您的 result 局部变量做任何有用的事情,例如将其分配给过滤器上下文:

filterContext.Result = result;

【讨论】:

  • 是的,这个缺失的部分很关键 :-) 但无论如何它不起作用。母版页与部分视图一起返回。
  • @user49126,你能提供更多代码吗?您如何从客户端调用操作?该操作会引发什么错误?您是如何注册自定义属性的?
  • @user49126,在您添加的信息中,我无​​法在任何地方看到您如何从客户端代码调用操作方法。另外,您的 RegisterGlobalFilters 方法看起来如何?是否仍有可能与您的自定义属性冲突的标准 HandleErrorAttribute 调用?
  • 宾果游戏! RegisterGlobalFilters 方法中调用了标准的 HandleErrorAttribute。我完全忘记了。
【解决方案2】:

如果这不是 Ajax 请求,您需要重定向到某个 Action。在这个动作中返回 View()

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 2014-11-06
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多