¿Recuperar el nombre de la vista actual en ASP.NET MVC?

Tengo una vista parcial (control) que se utiliza en varias páginas de visualización, y necesito volver a transferir el nombre de la vista actual al controlador, por lo que si hay, por ejemplo, errores de validación, puedo volver a dibujar la vista original.

Una forma alternativa de hacerlo sería (en los métodos de controlador)

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

y luego en el parcial mismo, renderizarlo como

 <input type="hidden" name="viewName" value="" /> 

La pregunta es: ¿hay alguna propiedad o syntax que pueda usar para recuperar esto directamente en lugar de configurarlo desde el controlador? He intentado lo obvio:

 <input type="hidden" name="viewName" value="" /> 

pero esto no funciona ¿Que me estoy perdiendo aqui?

Gracias.

Bueno, si no te importa tener tu código vinculado al motor de vista específico que estás usando, puedes mirar la propiedad ViewContext.View y convertirlo a WebFormView

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

Creo que eso te dará el nombre de la vista al final.

EDITAR: Haacked es absolutamente directo; para hacer las cosas un poco más ordenadas, he envuelto la lógica en un método de extensión así:

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

que parece hacer exactamente lo que yo estaba buscando.

Tuve el mismo problema y así lo resolví:

 namespace System.Web.Mvc { public static class HtmlHelperExtensions { public static string CurrentViewName(this HtmlHelper html) { return System.IO.Path.GetFileNameWithoutExtension( ((RazorView)html.ViewContext.View).ViewPath ); } } } 

Luego en la vista:

 var name = Html.CurrentViewName(); 

o simplemente

 @Html.CurrentViewName() 

Si solo quieres el nombre de la acción, este sería el truco:

 public static string ViewName(this HtmlHelper html) { return html.ViewContext.RouteData.GetRequiredString("action"); } 

Si desea obtener el nombre de archivo dentro de una vista parcial, esto parece funcionar:

 public static class HtmlHelperExtensions { public static string GetViewFileName(this HtmlHelper html, object view) { return @"\\"+ view.GetType().FullName.Replace("ASP._Page_", "").Replace("_cshtml", ".cshtml").Replace("_", @"\\"); } } 

Y en la vista parcial, deberías hacer algo como esto:

 var filename = Html.GetViewFileName(this); 

o esto:

 @Html.GetViewFileName(this) 

Comente si este no es un buen enfoque, ¿alguna alternativa?

La solución más fácil es usar ViewBag.

 public ActionResult Index() { ViewBag.CurrentView = "Index"; return View(); } 

En la página cshtml

 @{ var viewName = ViewBag.CurrentView; } 

O,

 ((RazorView)ViewContext.View).ViewPath 

Si está buscando una solución para asp.net core, puede usar:

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

Esto devolverá el nombre de vista actual.

¿No deberías estar usando un método de validación como los implementos Nerd Dinner?

De esta forma, no es necesario que haga todo esto y solo puede devolver la Vista.

Tuve el mismo problema recientemente y el fragmento de código que se me ocurrió resolvió mi problema.

La única caída es que Request.UrlReferrer podría ser nulo en algunos casos. Un poco tarde pero parecía funcionar para mí y cubrí todas las bases de Request.UrlReferrer no siendo nulo.

  if (Request.UrlReferrer != null) { var viewUrl = Request.UrlReferrer.ToString(); var actionResultName = viewUrl.Substring(viewUrl.LastIndexOf('/')); var viewNameWithoutExtension = actionResultName.TrimStart('/'); } 

Acabo de escribir un blog acerca de esto

http://www.antix.co.uk/A-Developers-Blog/Targeting-Pages-with-CSS-in-ASP.NET-MVC

  ///  /// Get a string from the route data ///  public static string RouteString( this ViewContext context, string template) { foreach (var value in context.RouteData.Values) { template = template.Replace(string.Format("{{{0}}}", value.Key.ToLower()), value.Value == null ? string.Empty : value.Value.ToString().ToLower()); } return template; } 

uso

 "> 

EDITAR: Sí, esto no le dará el nombre de la vista como dice el primer comentario, le da el controlador y la acción. Pero dejarlo aquí es valioso saber que no es así.