在ASP.NET MVC中检索当前视图名称?

Dyl*_*tie 37 .net asp.net-mvc

我有一个在多个视图页面中使用的局部视图(控件),我需要将当前视图的名称传递回控制器 - 所以如果有例如验证错误,我可以重新绘制原始视图.

解决方法是(在控制器方法中)

var viewName = "Details"; // or whatever
ViewData["viewName"] = viewName;
return(View(viewName, customer));
Run Code Online (Sandbox Code Playgroud)

然后在部分本身中,将其渲染为

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

问题是 - 是否有一些属性或语法我可以直接检索它而不是从控制器设置它?我试过了明显的事:

<input type="hidden" name="viewName" 
    value="<%=Html.Encode(this.Name)%>" />
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我在这里错过了什么?

谢谢.

Haa*_*ked 36

好吧,如果您不介意将代码绑定到您正在使用的特定视图引擎,您可以查看ViewContext.View属性并将其转换为WebFormView

var viewPath = ((WebFormView)ViewContext.View).ViewPath;
Run Code Online (Sandbox Code Playgroud)

我相信最终会得到你的观点名称.

编辑: 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"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这看起来完全像我追求的那样.

  • 您可以转换为"BuildManagerCompiledView"而不是WebFormView.RazorView也从它扩展而来. (3认同)
  • 好的,我在这里有点迷失.您可以在视图中发布如何使用此扩展程序的示例吗?我如何获得IView?我正在使用MVC 3. (2认同)

Kon*_*man 15

我有同样的问题,这就是我解决它的方式:

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
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在视图中:

var name = Html.CurrentViewName();
Run Code Online (Sandbox Code Playgroud)

或者干脆

@Html.CurrentViewName()
Run Code Online (Sandbox Code Playgroud)


Dan*_*ott 9

如果你只想要动作名称那么这就可以了:

public static string ViewName(this HtmlHelper html)
{
    return html.ViewContext.RouteData.GetRequiredString("action");
}
Run Code Online (Sandbox Code Playgroud)

  • 我需要视图名称,而不是操作名称.视图不包含在任何地方的路径数据中; 它由控制器方法的返回值决定. (7认同)
  • -1见我对Anthony Johnston答案的评论。对于新手来说,这完全是误导!! (2认同)

Mah*_*hib 5

最简单的解决方案是使用 ViewBag。

public ActionResult Index()
    {
        ViewBag.CurrentView = "Index";
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

在cshtml页面上

@{
var viewName = ViewBag.CurrentView;
}
Run Code Online (Sandbox Code Playgroud)

或者,

((RazorView)ViewContext.View).ViewPath
Run Code Online (Sandbox Code Playgroud)