Is it possible to get the View name from within La

2019-05-05 21:13发布

问题:

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?

回答1:

The following will get you the view name:

((RazorView)ViewContext.View).ViewPath;


回答2:

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();
}


回答3:

If you use MVC Core you can use:

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