MVC3: Как программно получить выполняемое в настоящее время представление или частичное представление внутри расширения HtmlHelper? - PullRequest
8 голосов
/ 06 июня 2011

Как программно получить текущее имя или частичное имя представления внутри расширения HtmlHelper? В моей ситуации я не могу использовать ViewData или не могу передать имя представления расширению из View.

Ответы [ 4 ]

8 голосов
/ 24 октября 2011
var webPage = htmlhelper.ViewDataContainer as WebPageBase;
var virtualPath = webPage.VirtualPath;
2 голосов
/ 22 августа 2011

Существует один грязный способ найти реальный путь даже для частичного просмотра, но он действительно ... грязный.

helper.ViewDataContainer имеет тип, подобный "ASP._Page_Areas_Users_Views_Customers_PersonContactsModel_cshtml".Таким образом, вы можете проанализировать его и получить путь.

Другой способ немного уродлив: базовый класс вида бритвы содержит свойство VirtualPath, которое содержит путь к представлению.Вы можете передать его помощнику

2 голосов
/ 06 июня 2011
0 голосов
/ 27 февраля 2013

На основании того, что сказал Василий, я придумал этот 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);
    }

Моя цель состояла в том, чтобы создать помощника, который позволял бы вам ссылаться на специфичный для PartialView Bundle, используя Cassette будет иметь путь, почти идентичный пути PartialView), но вы можете увидеть принципал в действии ...

...