MVC3:如何在HtmlHelper扩展中以编程方式获取当前正在执行的视图或部分视图?

时间:2011-06-05 21:48:19

标签: asp.net-mvc-3 view html-helper

如何在HtmlHelper扩展程序中以编程方式获取当前正在执行的视图名称或部分视图名称?在我的情况下,我无法使用ViewData或无法将视图名称传递给View中的扩展名。

4 个答案:

答案 0 :(得分:8)

var webPage = htmlhelper.ViewDataContainer as WebPageBase;
var virtualPath = webPage.VirtualPath;

答案 1 :(得分:2)

答案 2 :(得分:2)

即使是部分视图,也有一种肮脏的方法可以找到真正的路径,但它真的很脏。

helper.ViewDataContainer的类型类似于“ASP._Page_Areas_Users_Views_Customers_PersonContactsModel_cshtml”。 所以你可以解析它并获得路径。

另一种方式有点难看:基本剃刀视图类包含属性VirtualPath,其中包含视图的路径。您可以将其传递给帮助者

答案 3 :(得分:0)

基于瓦西里所说的我想出了这个HtmlHelper:

    public static void ReferencePartialViewBundle(this HtmlHelper helper)
    {
        // Will be something like this: "_Page_Areas_GPFund_Views_Entry__EntryVentureValuationEdit_cshtml"
        var viewDataContainerName = helper.ViewDataContainer.GetType().Name; 

        //Determine bundle name
        var bundleName = viewDataContainerName
            .Replace("__", "_¬")              //Preserve Partial "_" prefixes #1: Convert partial prefix "_" to "¬" temporarily
            .Replace("_cshtml", ".js")        //We want a js file not a cshtml
            .Replace("_", "/")
            .Replace("¬", "_")                //Preserve Partial "_" prefixes #2: Convert partial prefix "¬" back to "_" 
            .Replace("/Page/", "~/Scripts/"); //All our js files live in ~/Scripts/ and then a duplicate of the file structure for views

        //Reference bundle
        Bundles.Reference(bundleName);
    }

我的目的是创建一个帮助程序,允许您使用Cassette引用特定于PartialView的Bundle(它的路径几乎与PartialView路径相同)但您可以看到行动中的主体... < / p>