.netasp.net-mvc

Retrieve the current view name in ASP.NET MVC?


I have a partial view (control) that's used across several view pages, and I need to pass the name of the current view back to the controller - so if there's e.g. validation errors, I can re-draw the original view.

A workaround way to do it would be (in the controller methods)

var viewName = "Details"; // or whatever
ViewData["viewName"] = viewName;
return(View(viewName, customer));

and then in the partial itself, render it as

<input type="hidden" name="viewName" 
    value="<%=Html.Encode(ViewData["viewName"])%>" />

Question is - is there some property or syntax I can use to retrieve this directly instead of setting it from the controller? I've tried the obvious:

<input type="hidden" name="viewName" 
    value="<%=Html.Encode(this.Name)%>" />

but this doesn't work. What am I missing here?

Thanks.


Solution

  • Well if you don't mind having your code tied to the specific view engine you're using, you can look at the ViewContext.View property and cast it to WebFormView

    var viewPath = ((WebFormView)ViewContext.View).ViewPath;
    

    I believe that will get you the view name at the end.

    EDIT: Haacked is absolutely spot-on; to make things a bit neater I've wrapped the logic up in an extension method like so:

    public static class IViewExtensions {
        public static string GetWebFormViewName(this IView view) {
            if (view is WebFormView) {
                string viewUrl = ((WebFormView)view).ViewPath;
                string viewFileName = viewUrl.Substring(viewUrl.LastIndexOf('/'));
                string viewFileNameWithoutExtension = Path.GetFileNameWithoutExtension(viewFileName);
                return (viewFileNameWithoutExtension);
            } else {
                throw (new InvalidOperationException("This view is not a WebFormView"));
            }
        }
    }
    

    which seems to do exactly what I was after.