Что не так с моим HtmlHelper? - PullRequest
3 голосов
/ 06 июня 2010

Я создал метод расширения Html в классе Helper, но не могу заставить его работать. Я реализовал это, как показано на разных уроках.

Мой статический класс MenuItemHelper:

public static string MenuItem(this HtmlHelper helper, string linkText, string actionName, string controllerName)
    {
        var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
        var currentActionName = (string)helper.ViewContext.RouteData.Values["action"];

        var sb = new StringBuilder();

        if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase))
            sb.Append("<li class=\"selected\">");
        else
            sb.Append("<li>");

        sb.Append(helper.ActionLink(linkText, actionName, controllerName));
        sb.Append("</li>");
        return sb.ToString();
    }

импорт пространства имен

<%@ Import Namespace="MYAPP.Web.App.Helpers" %>

Реализация на моей master.page

<%= Html.MenuItem("TEST LINK", "About", "Site") %> 

Я получаю сообщение об ошибке:

Метод не найден.

EDIT: Похоже, проблема в названии приложения. папка называется MYAPP-MVC.Web, но в классах она переводится в MYAPP_MVC.Web

Я только что попробовал его на новом приложении, и оно работает

Ответы [ 2 ]

11 голосов
/ 06 июня 2010

Попробуйте переписать свой помощник в стиле ASP.NET MVCish 2.0. Также не забудьте добавить использование System.Web.Mvc.Html в ваше пространство имен помощника, чтобы иметь доступ к методу ActionLink:

namespace MYAPP.Web.App.Helpers
{
    using System.Web.Mvc;
    using System.Web.Mvc.Html;

    public static class HtmlExtensions
    {
        public static MvcHtmlString MenuItem(this HtmlHelper helper, string linkText, string actionName, string controllerName)
        {
            var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
            var currentActionName = (string)helper.ViewContext.RouteData.Values["action"];

            var li = new TagBuilder("li");
            if (string.Equals(currentControllerName, controllerName, StringComparison.CurrentCultureIgnoreCase) &&
                string.Equals(currentActionName, actionName, StringComparison.CurrentCultureIgnoreCase))
            {
                li.AddCssClass("selected");
            }

            li.InnerHtml = helper.ActionLink(linkText, actionName, controllerName).ToHtmlString();
            return MvcHtmlString.Create(li.ToString());
        }
    }
}

Если это не сработает, у вас определенно есть проблемы с версией при использовании сборки System.Web.Mvc.

0 голосов
/ 06 июня 2010

Вам необходимо сделать метод расширения доступным для страницы / просмотра. Вы можете сделать это для отдельной страницы, добавив директиву вверху

<%@ Import namespace="Namespace.Where.Your.HtmlHelper.Extension.Is.Defined" %>

или вы можете сделать его доступным для всех страниц, добавив его к

<pages> 
    <namespaces>
        <add namespace="Namespace.Where.Your.HtmlHelper.Extension.Is.Defined" />
    </namespaces>
</pages>

раздел в web.config.

EDIT:

Проблема может заключаться в том, что HtmlHelper.ActionLink() возвращает MvcHtmlString, а не string. Я думаю, что вы должны вызвать ToString() на него при вызове append с StringBuilder. Как уже указывалось, в идеале вы должны возвращать MvcHtmlString, чтобы другие могли использовать ваш метод расширения с синтаксисом <%: ... %> и не кодировать вывод снова.

...