I'm trying to pull the name of the current View from within my Layout.
Usually, VirtualPath
is used for this. Unfortunately, this will return the path of the Layout file.
Is there any way to get the name of the View that's returned by the controller?
The following will get you the view name:
((RazorView)ViewContext.View).ViewPath;
You can use ViewBag. Define a CurrentView
property to it and use that.
public ActionResult Create()
{
ViewBag.CurrentView = "Create";
return View();
}
And in the layout, you can read and use it like
<h2>@ViewBag.CurrentView</h2>
Or if you want to get it into a variable
@{
var viewName = ViewBag.CurrentView;
}
If you do not wish to explicitly set the viewbag property name, you can write a custom action filter to do that.
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;
}
}
}
And you need to decorate your action methods with our new action filter
[TrackViewName]
public ActionResult Create()
{
return View();
}
If you use MVC Core you can use:
@System.IO.Path.GetFileNameWithoutExtension(ViewContext.View.Path)