MVC3 Учебник HtmlHelper не работает - PullRequest
3 голосов
/ 11 марта 2011

У меня проблема с учебником MVC3 MusicStore. Он определяет HtmlHelper с методом Truncate. Помощник выглядит так:

using System.Web.Mvc;

namespace MusicStore.Helpers
{
    public class HtmlHelpers
    {
        public static string Truncate(this HtmlHelper helper, string input, int length)
        {
            if (input.Length <= length)
            {
                return input;
            }
            else
            {
                return input.Substring(0, length) + "...";
            }
        }
    }
}

В представлении я импортирую его с помощью @using MusicStore.Helpers, а затем пытаюсь использовать его с <td>@Html.Truncate(item.Title, 25) </td>

Однако компилятор говорит мне, что такого метода (Truncate) не существует, и, похоже, ищет Truncate в IEnumerable [MvcMusicStore.Models.Album] (который является моей моделью), а не в моем классе HtmlHelpers.

(NB квадратные скобки в моем коде действительно угловые скобки, не могу их избежать)

Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

Ответы [ 3 ]

9 голосов
/ 11 марта 2011

Методы расширения должны быть объявлены в статическом классе:

public static class HtmlHelpers
{
    public static string Truncate(
        this HtmlHelper helper, 
        string input, 
        int length
    )
    {
        if (input.Length <= length)
        {
            return input;
        }
        return input.Substring(0, length) + "...";
    }
}

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

@using System.Web.Mvc
...
<td>@Html.Truncate(item.Title, 25)</td>

или если вы хотите, чтобы помощник был доступен во всех представлениях Razor без необходимости добавления директивы using, вы можете добавить соответствующее пространство имен в раздел пространств имен ~/Views/web.config файла:

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="Namespace.Containig.Static.Class.With.Custom.Helpers" />
      </namespaces>
    </pages>
</system.web.webPages.razor>
0 голосов
/ 11 марта 2011

Вы также можете рассмотреть возможность добавления пространства имен в ваш web.config. Я знаю, что использую своих помощников на нескольких страницах. Не забывать добавлять using к каждому виду - это боль.

<system.web>
  <pages>
    <namespaces>
      <add namespace="MusicStore.Helpers"/>
    </namespaces>
  </pages>
</system.web>
0 голосов
/ 11 марта 2011

Методы расширения должны быть определены в статическом классе.Поэтому измените свой код на:

public static class HtmlHelpers
{
    public static string Truncate(this HtmlHelper helper, string input, int length)
    {
        if (input.Length <= length)
        {
            return input;
        }
        else
        {
            return input.Substring(0, length) + "...";
        }
    }
}

Кроме того, @Darin Dimitrov поднимает хороший вопрос - вам действительно следует повторно запустить экземпляр MvcHtmlString.

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

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