是否可以从布局中获取视图名称?

Posted

技术标签:

【中文标题】是否可以从布局中获取视图名称?【英文标题】:Is it possible to get the View name from within Layout? 【发布时间】:2016-03-15 07:33:16 【问题描述】:

我正在尝试从我的布局中提取当前视图的名称。

通常,VirtualPath 用于此目的。不幸的是,这将返回布局文件的路径。

有什么方法可以获取控制器返回的视图名称吗?

【问题讨论】:

【参考方案1】:

以下将为您获取视图名称:

((RazorView)ViewContext.View).ViewPath;

【讨论】:

【参考方案2】:

如果你使用 MVC Core,你可以使用:

@System.IO.Path.GetFileNameWithoutExtension(ViewContext.View.Path)

【讨论】:

完美。我找不到核心特定问题。【参考方案3】:

您可以使用ViewBag。为它定义一个CurrentView 属性并使用它。

public ActionResult Create()

  ViewBag.CurrentView = "Create";
  return View();

而且在布局中,你可以像阅读和使用一样

<h2>@ViewBag.CurrentView</h2>

或者如果你想把它变成一个变量

@ 
    var viewName = ViewBag.CurrentView;

如果您不希望显式设置 viewbag 属性名称,您可以编写自定义操作过滤器来执行此操作。

public class TrackViewName : ActionFilterAttribute

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    
        ViewResultBase view = filterContext.Result as ViewResultBase;
        if (view != null)
        
            string viewName =view.ViewName;
            // If we did not explicitly specify the view name in View() method,
            // it will be same as the action name. So let's get that.
            if(String.IsNullOrEmpty(viewName))
            
                viewName =  filterContext.ActionDescriptor.ActionName;
            
            view.ViewBag.CurrentView =  viewName;
        
    

您需要使用我们新的操作过滤器来装饰您的操作方法

[TrackViewName]
public ActionResult Create()
     
  return View();

【讨论】:

谢谢,但我真的需要一个隐式解决方案——一个不需要我在控制器操作中使用显式分配乱扔代码的解决方案。如果这不可能,我可能不得不重新考虑我的实现。 @JeradRose 是的,这是可能的。我们可以在动作过滤器中做到这一点。请参阅我的更新答案。 谢谢,我在您的原始帖子之后开始朝这个方向思考。我也尝试了 Harsh 的解决方案,这似乎运作良好。【参考方案4】:

对于 asp.net 核心 3: 在_Layout.cshtml中获取当前View:

this.ViewContext.View.Path

这将产生如下内容: "/Views/Home/Index.cshtml"

那么你可以这样做:

@if(this.ViewContext.View.Path == "/Views/Home/SomePage.cshtml")

   <span>In Some Page</span>

你可以省略'this'。

【讨论】:

以上是关于是否可以从布局中获取视图名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在编辑视图布局中获取记录ID?

获取 couchdb 中所有视图名称的列表

从 XML 中获取视图

从布局中获取位图会使布局不完整

从视图/控制器获取 pimcore 片段名称

从 recyclerview 获取 TextView 字符串