HTML метод класса помощника не работает - PullRequest
3 голосов
/ 21 марта 2012

Я застрял в справочнике Стивена Сандерсона / Adum Freeman Pro ASP .Net MVC 3. Я поднялся на страницу 185, где HTML-помощник должен использоваться для возврата номера страниц в ссылках.Я нашел помощь на этом сайте, решающую мою проблему с этим справочником, и прошел через каждый шаг, все еще имеющий те же проблемы (ссылка) Ошибка метода расширения MVC

Когда я запускаю код вбраузер Я получаю эту ошибку:

Сообщение об ошибке компилятора: CS1973: «System.Web.Mvc.HtmlHelper» не имеет применимого метода с именем «PageLinks», но, по-видимому, имеет метод расширения с таким именем.Методы расширения не могут быть динамически отправлены.Попробуйте привести динамические аргументы или вызвать метод расширения без синтаксиса метода расширения

Код строится нормально, но если я открою любой другой класс для редактирования этой строки кода в моем вспомогательном методе, получит ту же ошибку, что ивыше.

@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new {page = x}))

Класс помощника:

namespace SportsStore.WebUI.HtmlHelpers
{
    public static class PagingHelpers
    {
        public static MvcHtmlString PageLinks(this HtmlHelper html, 
                                                PagingInfo pagingInfo, 
                                                Func<int, string> pageURL)
        {
            StringBuilder results = new StringBuilder();
            for (int i = 1; i <= pagingInfo.TotalPages; i++)
            {
                TagBuilder tag = new TagBuilder("a"); 
                tag.MergeAttribute("href", pageURL(i));
                tag.InnerHtml = i.ToString();
                if (i == pagingInfo.CurrentPage)
                    tag.AddCssClass("selected");
                results.Append(tag.ToString());
            }
            return MvcHtmlString.Create(results.ToString());
        }
    }
}

Мой просмотр:

@{
    ViewBag.Title = "Products";
 }

@foreach (var p in Model.Products) { 
    <div class="item">
        <h3>@p.Name</h3>
        @p.Description
        <h4>@p.Price.ToString("c")</h4>
    </div>
}

<div class="pager">
    @Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new {page = x}))
</div>

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="SportsStore.WebUI.HtmlHelpers"/> 
        </namespaces> 
     </pages> 
 </system.web.webPages.razor>

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Вы передаете динамическое значение методу расширения. (Наведите указатель мыши на Model.PagingInfo и intellisense, чтобы сообщить вам, что тип является динамическим. Это означает, что он не знает, что это за тип, до времени выполнения) Итак, попробуйте изменить код так, чтобы он приводил динамический тип следующим образом:

@Html.PageLinks((PagingInfo)Model.PagingInfo, x => Url.Action("List", new {page = x}))

Вы можете исправить это двумя другими способами:

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

PageLinks(Html, Model.PagingInfo, x => Url.Action("List", new {page = x}))

ИЛИ вы можете заставить представление знать, какой будет модель, чтобы она не использовала динамику, установив это в верхней части вашего представления

@model PagingInfo
0 голосов
/ 14 августа 2018

Добавить @using имя_проекта.HtmlHelpers, например:

@using ChristianSchool.HtmlHelpers
@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x, category = Model.CurrentCategory }))

0 голосов
/ 14 декабря 2015

Вы должны добавить эти строки в web.cofig под Папкой Представлений, а не основной

  <add namespace="YourProjectName.HtmlHelpers"/>
...