【问题标题】:Remove Layout of View on IResultFilter删除 IResultFilter 上的视图布局
【发布时间】:2021-03-19 06:19:55
【问题描述】:

如何从IResultFilter.OnResultExecuting 上的视图中删除视图的 Layout 属性?

编辑:

如果请求来自 AJAX,我正在尝试删除布局。 以下对我不起作用:

public class RemoveLayoutIfRequestIsFromAjaxResultFilterAttribute : ResultFilterAttribute
    {
        

        public override void OnResultExecuted(ResultExecutedContext context)
        {
            if (!(context.Result is ViewResult viewResult))
                return;

            if (context.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                viewResult.ViewData["Layout"] = "";
            }
            else
            {
                viewResult.ViewData["Layout"] = "_Layout";
            }
        }
    }

我也试过OnResultExecuting方法,没有成功。

【问题讨论】:

  • 想详细说明一下?你想达到什么目的?
  • 你应该使用OnResultExecuting。并确保在请求的视图中没有指定布局。
  • 我无法让它工作,即使从 _views tart 中删除了布局。
  • 是否删除指定视图中的布局?

标签: c# asp.net-mvc asp.net-core filter


【解决方案1】:

布局是通过ViewData设置的,可以通过改变当前视图的布局 ViewData["Layout"]ViewResult

通过将布局的值设置为空来删除布局。

public class ViewLayoutAttribute : ResultFilterAttribute
{
    public ViewLayoutAttribute()
    {

    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        var viewResult = context.Result as ViewResult;
        if (viewResult != null)
        {
            viewResult.ViewData["Layout"] = "";
        }
    }
}

控制器

    [ViewLayout]
    public IActionResult Index()
    {
        return View();
    }

注意:如果当前视图中已经设置好布局,如:

@{
    Layout = "_Layout2";
}

视图会优先考虑当前视图设置的布局(_Layout2)。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2016-11-10
    相关资源
    最近更新 更多