是否可以从布局中获取视图名称?
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'。
【讨论】:
以上是关于是否可以从布局中获取视图名称?的主要内容,如果未能解决你的问题,请参考以下文章