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

时间:2015-12-09 20:54:47

标签: asp.net-mvc asp.net-mvc-5

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

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

有没有办法获取控制器返回的View的名称?

3 个答案:

答案 0 :(得分:8)

以下内容将为您提供视图名称:

((RazorView)ViewContext.View).ViewPath;

答案 1 :(得分: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();
}

答案 2 :(得分:1)

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

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