2011-12-22 1 views
3

У меня есть веб-приложение ASP.NET MVC 3 Razor.Доступ к WebViewPage из пользовательского HTML-помощника

У меня WebViewPage расширение:

public static bool Blah(this WebViewPage webViewPage) 
{ 
    return blah && blah; 
} 

И я хочу, чтобы получить доступ к этому от моего HtmlHelper расширения:

public static MvcHtmlString BlahHelper(this HtmlHelper htmlHelper, string linkText, string actionName) 
{ 
    // how can i get access to the WebViewPage extension method here? 
} 

Я могу конечно дублировать функциональность расширения WebViewPage, если я должен был, но просто интересно, можно ли получить доступ к нему из HTML-помощника.

ответ

8
// Warning: this cast will crash 
// if you are not using the Razor view engine 
var wvp = (WebViewPage)htmlHelper.ViewDataContainer; 
var result = wvp.Blah(); 
+0

Дарин на помощь СНОВА. Спасибо дружище. :) – RPM1984

0

Вы должны изменить этот метод для расширения HttpContextBase, с которого вы можете получить доступ как от , так и от WebViewPage.

+0

вопрос не был действительно о функциональности расширения, но как добиться того, что я спрашиваю, в общем смысле. Я отредактировал вопрос, чтобы отразить это. – RPM1984

+0

Я не думаю, что это возможно; изучите 'htmlHelper' в окне Locals и посмотрите, можете ли вы его найти. – SLaks

0

Я хотел бы попробовать:

((WebViewPage)htmlHelper.ViewContext.View). Blah() 
+0

Nice попробовать. Похоже, что 'Просмотр' на самом деле является механизмом просмотра, а не страницей просмотра. И я использую настраиваемый механизм просмотра (генератор Razor CSHTML), поэтому тип 'PrecompiledRazorViewEngine'. – RPM1984

0

У меня была такая же проблема, и принятый ответ привел меня к решению (+1). Возможно, этот намек помогает и кому-то другому. Кроме того, мне пришлось использовать универсальную версию WebViewPage внутри строгого вида. В противном случае я получил исключение типа.

public static MvcHtmlString ToBodyEnd<TModel>(this HtmlHelper<TModel> htmlHelper, ...) { 
     var vp = (DerivedWebViewPage<TModel>)htmlHelper.ViewDataContainer; 
    //... more code ... 
    }