检索ASP.NET MVC中的当前视图名称?
我有一个部分视图(控制),用于多个视图页面,我需要将当前视图的名称传递回控制器 – 所以如果有validation错误,我可以重新绘制原始视图。
解决方法是(在控制器方法中)
var viewName = "Details"; // or whatever ViewData["viewName"] = viewName; return(View(viewName, customer));
然后在部分本身中呈现
<input type="hidden" name="viewName" value="<%=Html.Encode(ViewData["viewName"])%>" />
问题是 – 是否有一些属性或语法我可以直接检索,而不是从控制器设置它? 我已经尝试了显而易见的:
<input type="hidden" name="viewName" value="<%=Html.Encode(this.Name)%>" />
但是这不起作用。 我在这里错过了什么?
谢谢。
那么如果你不介意让你的代码绑定到你正在使用的特定的视图引擎,你可以看看ViewContext.View
属性并将其转换为WebFormView
var viewPath = ((WebFormView)ViewContext.View).ViewPath;
我相信会在最后得到你的视图名称。
编辑: Haacked绝对是现货; 使事情有点整洁我已经用如下扩展方法包装了逻辑:
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")); } } }
这似乎正是我所追求的。
我有同样的问题,这就是我解决它的方法:
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 ); } } }
然后在视图中:
var name = Html.CurrentViewName();
或干脆
@Html.CurrentViewName()
如果你只是想要的行动名称,那么这将做的伎俩:
public static string ViewName(this HtmlHelper html) { return html.ViewContext.RouteData.GetRequiredString("action"); }
如果你想从部分视图中获取文件名,这似乎工作:
public static class HtmlHelperExtensions { public static string GetViewFileName(this HtmlHelper html, object view) { return @"\\"+ view.GetType().FullName.Replace("ASP._Page_", "").Replace("_cshtml", ".cshtml").Replace("_", @"\\"); } }
在局部看来,你应该这样做:
var filename = Html.GetViewFileName(this);
或这个:
@Html.GetViewFileName(this)
请做评论,如果这不是一个好方法 – 任何替代品?
最简单的解决scheme是使用ViewBag。
public ActionResult Index() { ViewBag.CurrentView = "Index"; return View(); }
在cshtml页面上
@{ var viewName = ViewBag.CurrentView; }
要么,
((RazorView)ViewContext.View).ViewPath
你不应该使用像书呆子晚餐工具一样的validation方法吗?
这样,你实际上不需要做这一切,你可以返回视图。
我最近有同样的问题,我想出了代码片段解决了我的问题。
唯一的缺点是Request.UrlReferrer在某些情况下可能为空。 有点晚了,但似乎为我工作,我涵盖了Request.UrlReferrer的所有基地不为空。
if (Request.UrlReferrer != null) { var viewUrl = Request.UrlReferrer.ToString(); var actionResultName = viewUrl.Substring(viewUrl.LastIndexOf('/')); var viewNameWithoutExtension = actionResultName.TrimStart('/'); }
刚刚写了一个关于这个博客thingy
http://www.antix.co.uk/A-Developers-Blog/Targeting-Pages-with-CSS-in-ASP.NET-MVC
/// <summary> /// <para>Get a string from the route data</para> /// </summary> 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; }
用法
<body class="<%= ViewContext.RouteString("{controller}_{action}") %>">
编辑:是的,这不会给你视图名称作为第一个评论状态,它给你的控制器和行动。 但是把它留在这里是很有价值的,要知道它没有。