Вызов вспомогательных помощников из встроенных помощников - как? - PullRequest
1 голос
/ 08 июня 2011

Я прочитал эту [полезную статью] , в которой говорится, что я могу создать библиотеку встроенных помощников, поместив их в представление в специальной папке App_Code. Когда я переместил туда свои @helper функции, я перестал работать с помощниками по расширению. Я прочитал [в этой статье] , что есть проблема, потому что @helper являются статическими, а мои расширения нет ... Я пробовал 2 разных способа, но не могу заставить его работать. Он не может распознать существование моих помощников по расширению.

'System.Web.WebPages.Html.HtmlHelper' does not contain a definition for 'Image'

мой помощник по расширению называется 'Изображение'. Что я должен искать?

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

В качестве примера, следующий код использует функцию «RenderPage» в вспомогательной библиотеке:

@helper GetSection(string sectionName, string sectionTitle, string sectionFileName){
    <div id="@sectionName">
        <h1>@sectionTitle</h1>
        @System.Web.WebPages.WebPageContext.Current.Page.RenderPage("~/Views/Shared/MySections/" + @sectionFileName)
    </div>
}

Он демонстрирует, как получить экземпляр * текущей страницы *1005* (контекстно-зависимый).

Этот код отлично работает из вашего собственного вспомогательного файла Razor "common library" (".cshtml"), расположенного в подпапке "* app_code *" вашего проекта.

1 голос
/ 30 июня 2011

Когда вы пишете Helperextension в виде бритвы.Вам нужно назвать его как FileName.Method.

, например, у вас есть файл CustomHelpers.cshtml в app_code, и у вас есть метод

     @helper TruncateString(string input, int length)
     {        
        if (input.Length <= length)
        {      
            @input        
        }
        else
        { 
          @input.Substring(0, length)<text>...</text>        
        }
    }

, который вы можете вызвать из index.cshtml

    @CustomHelpers.TruncateString("Example", 8); 
0 голосов
/ 02 июля 2011

хорошо, моя проблема была связана с пространством имен ... так что я имею в \ Views \ Shared \ HtmlHelpers.cs:

public static class Html
{
    public static MvcHtmlString Image(this HtmlHelper helper, string src, object htmlAttrs = null)
    {

, к которому я обычно обращаюсь со своих страниц следующим образом:

@Html.Image("/path/to/image")

в App_Code \ Helpers.cshtml:

@helper AddButton(string path)
{
    var Html = ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html;
    @Html.Image(path);
}

но Intellisense подчеркнет «Имидж» и пожалуется:

'System.Web.Mvc.HtmlHelper<object>' does not contain a definition for 'Image'
and no extension method 'Image' accepting a first argument of type 
'System.Web.Mvc.HtmlHelper<object>' could be found (are
you missing a directive or an assembly reference?)

причина, по-видимому, заключается в том, что Helpers.cshtml должен иметь @using для пространства имен ... на моих обычных страницах пространство имен включено в мой web.config, но эта страница кажется освобожденной от этого механизма

...