Мой метод расширения не регистрируется - PullRequest
3 голосов
/ 08 августа 2010

Я слежу за книгой Pro ASP.Net MVC2, и буквально 90% всего нового для меня. Я чувствую себя ребенком в кондитерской! :)

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

Теперь у меня проблемы с тестом, который книга просит нас разработать.

[Test]
        public void Can_Generate_Links_To_Other_Pages()
        {
            // Arrange: We're going to extend the HtmlHelper class.
            // It doesn't matter if the variable we use is null.
            HtmlHelper html = null;

            // Arrange: The helper should take a PagingInfo instance (that's
            // a class we haven't yet defined) and a lambda to specify the URLs
            PagingInfo pagingInfo = new PagingInfo
            {
                CurrentPage = 2,
                TotalItems = 28,
                ItemsPerPage = 10
            };

            Func<int, string> pageUrl = i => "Page" + i;

            // Act
            MvcHtmlString result = html.PageLinks(pagingInfo, pageUrl);

            // Assert: Here's how it should format the links
            result.ToString().ShouldEqual(@"<a href=""Page1"">1</a>
                                            <a class=""selected"" href=""Page2"">2</a>
                                            <a href=""Page3"">3</a>");
        }

Моя переменная html является переменной HtmlHelper. Похоже, что метод расширения PageLinks () зарегистрирован неправильно.

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

EDIT:

Очевидно, именно здесь я зарегистрировал метод расширения. Хотя, похоже, ничего не расширяется. По крайней мере, intellisnse не показывает его, когда я набираю его в приведенном выше коде.

public static class PagingHelpers
    {
        public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int, string> pageUrl)
        {
            StringBuilder result = new StringBuilder();

            for (int i = 1; i <= pagingInfo.TotalPages; i++)
            {
                TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag
                tag.MergeAttribute("href", pageUrl(i));
                tag.InnerHtml = i.ToString();
                if (i == pagingInfo.CurrentPage)
                    tag.AddCssClass("selected");
                result.AppendLine(tag.ToString());
            }

            return MvcHtmlString.Create(result.ToString());         
        }
    }

Кроме того, кто-нибудь может сказать мне, как настроить Visual Studio, чтобы он просто копировал простой текст без смешных отступов?

РЕДАКТИРОВАТЬ 2: Woops! Забыл ввести ошибку:

Ошибка 1 'System.Web.Mvc.HtmlHelper' не содержит определения для «PageLinks» и без метода расширения «PageLinks» принимает первый аргумент типа 'System.Web.Mvc.HtmlHelper' может быть найден (вы пропускаете используя директиву или сборку ссылка?) C: \ Users \ Sergio \ Documents \ visual студия 2010 \ Проекты \ SportsStore \ SportsStore.UnitTests \ DisplayingPageLinks.cs 35 41 SportsStore.UnitTests

Ответы [ 5 ]

8 голосов
/ 08 августа 2010

Чтобы использовать метод расширения, необходимо включить пространство имен, в котором находится класс метода расширения. Также необходимо убедиться, что класс метода расширения является статическим и доступен для потребляющего кода (например, не может быть внутренним, если он находится в другой сборке). Наконец, не забудьте забыть ключевое слово this для типа, который вы расширяете. Если все это на месте, проблемы не должно быть.

3 голосов
/ 24 декабря 2010

Вы можете добавить пространство имен ко всем своим страницам в файле web.config следующим образом:

<system.web>
 <pages>
  <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="System.Linq"/>
    <add namespace="System.Collections.Generic"/>
    <add namespace="YourNameSpace.HtmlHelpers"/>
  </namespaces>
</pages>

0 голосов
/ 30 июня 2015

Вы можете удалить this HtmlHelper html, из параметров кода метода PageLinks в классе PagingHelpers и заменить HtmlHelper на PagingHelpers как это MvcHtmlString result = PagingHelpers.PageLinks(pagingInfo, pageUrl);

HtmlHelper не используется в вашем примере.

0 голосов
/ 21 февраля 2014

Вам необходимо добавить в свой List.cshtml над кодом эту строку

@model SportsStore.WebUI.Models.ProductsListViewModel
0 голосов
/ 01 июля 2013

Используйте

MvcHtmlString result = PagingHelpers.PageLinks(myHelper, pagingInfo, pageUrlDelegate);

вместо

MvcHtmlString result = myHelper.PageLinks(pagingInfo, pageUrlDelegate);
...