ASP.NET MVC 2 метод RouteLink - PullRequest
       1

ASP.NET MVC 2 метод RouteLink

0 голосов
/ 17 февраля 2011

Я новичок в ASP.NET MVC и не могу понять это. Работая с примером Nerdinner из Professional ASP.NET MVC 2, я скопировал вспомогательный класс PaginatedList и решил улучшить его, чтобы прямые и обратные ссылки могли быть созданы методом внутри класса вместо записи их на каждой странице представления. Я скопировал это из представления, что это было, Index.aspx:

if (Model.HasPreviousPage)
    {
        Response.Write(Html.RouteLink("<<<", "Users", new { page=(Model.PageIndex-1) }));
    }

И использовал его для создания этого метода в Helpers \ PaginatedList.cs:

public string NavLinks()
{
    if (HasPreviousPage)
    {
        return Html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
    }
}

(HasPreviousPage - это простой метод в PaginatedList.)

Сразу же он жалуется, что «Имя« HTML »не существует в текущем контексте, поэтому я изменил его, чтобы принять параметр:

public string NavLinks(HtmlHelper Html)

Теперь я получаю, что «System.Web.Mvc.HtmlHelper» не содержит определения для «RouteLink», и не найдено никакого метода расширения «RouteLink», принимающего первый аргумент типа «System.Web.Mvc.HtmlHelper» (вам не хватает директивы using или ссылки на сборку?) ".

Согласно документации Microsoft по методу LinkExtensions.RouteLink, «В Visual Basic и C # этот метод можно вызывать как метод экземпляра для любого объекта типа HtmlHelper». Они лгут?

Помощь!

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Если вы пытаетесь сделать это HtmlHelper, просто измените

public string NavLinks(HtmlHelper Html)
{
    if (HasPreviousPage)
    {
        return Html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
    }
}

до

using System.Web.Mvc;
using System.Web.Mvc.Html;

public static MvcHtmlString NavLinks(this HtmlHelper html, hasPreviousPage)
{
    if (hasPreviousPage)
    {
        return html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
    }
}

Все HtmlHelpers, содержащиеся в Mvc, являются статическими методами, а также они возвращают MvcHtmlString в Asp.net MVC 2. Это будет метод расширения для класса HtmlHelper. После добавления этих ссылок в ваш файл кода, который содержит эти методы расширения, вы должны увидеть внутри себя метод RouteLink.

0 голосов
/ 17 февраля 2011

@ DeathBedMotorcade

Это помогло, но мне пришлось изменить несколько вещей.

Метод не может быть статическим, поскольку ему необходим доступ к свойствам объекта (часть того же класса, PaginatedList), в частности, метод HasPreviousPage и переменная PageIndex.Затем он выдал ошибку «Метод расширения должен быть статическим».Удаление ключевого слова this исправило это.Итак, у меня есть:

public MvcHtmlString NavLinks(HtmlHelper html)
{
    if (HasPreviousPage)
    {
        return html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
    }
    if (HasNextPage)
    {
        return html.RouteLink(">>>", "Users", new { page=(PageIndex+1) });
    }
    return null;
} 

И в представлении:

Response.Write(Model.NavLinks(Html))

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

«использование System.Web.Mvc.Html» было ключевым, хотя я думал, что попробовал это в какой-то момент;вероятно, перед реализацией элемента "Html" (объект HtmlHelper, который неявно передается в представление?) необходимо было передать. VS обычно запрашивает пропущенные операторы Using, но на этот раз не сделал.1015 *

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