Как использовать ASP.NET MVC Html Helpers из пользовательского помощника? - PullRequest
12 голосов
/ 18 мая 2009

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

Как получить доступ к удобным существующим помощникам вида из моего пользовательского помощника вида? То есть в моем помощнике по пользовательскому виду я хотел бы использовать Url.Action (), Html.ActionLink и т. д. Как получить к ним доступ из моего помощника по пользовательскому представлению?

using System;
namespace MvcApp.Helpers
{
    public class SearchResultHelper
    {
        public static string Show(Result result)
        {
            string str = "";

            // producing HTML for search result here

            // instead of writing
            str += String.Format("<a href=\"/showresult/{0}\">{1}</a>", result.id, result.title);
            // I would like to use Url.Action, Html.ActionLink, etc. How?

            return str;
        }
    }
}

using System.Web.Mvc предоставляет доступ к HtmlHelpers, но, по-видимому, отсутствуют такие удобные методы, как ActionLink.

Ответы [ 4 ]

9 голосов
/ 18 мая 2009

Этот пример должен вам помочь. Этот помощник отображает различный текст ссылки в зависимости от того, вошел ли пользователь в систему или нет. Он демонстрирует использование ActionLink внутри моего пользовательского помощника:

    public static string FooterEditLink(this HtmlHelper helper,
        System.Security.Principal.IIdentity user, string loginText, string logoutText)
    {
        if (user.IsAuthenticated)
            return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, logoutText, "Logout", "Account",
                new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null);
        else
            return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, loginText, "Login", "Account",
                new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null);
    }

EDIT:
Все, что вам нужно сделать для доступа к методу Url.Action(), это заменить параметр this HtmlHelper helper чем-то вроде this UrlHelper urlHelp, а затем просто вызвать urlHelp.Action(...

Надеюсь, это поможет.

1 голос
/ 18 мая 2009

Простой помощник по граватаре в формате html, ваш класс также должен быть статичным.

  public static string GetGravatarURL(this HtmlHelper helper, string email, string size, string defaultImagePath)
    {

        return GetGravatarURL(email, size) + string.Format("&default={0}", defaultImagePath);

    }
0 голосов
/ 18 мая 2009

вы можете расширить стандартные HtmlHelper и UrlHelper просто с помощью метода расширения (поэтому у вас есть xxxHelper в качестве первого параметра в вашем методе).

Или вы можете просто создать базовое представление нужным вам методом и использовать переменную Html или URL представления.

0 голосов
/ 18 мая 2009

По моему мнению, вы не должны пытаться использовать ActionLink внутри кода. Вся концепция MVC заключается в том, чтобы отделить логику от дисплея, поэтому вам следует придерживаться этого.

Я бы посоветовал вам передать объект результата в представление (возможно, через ViewData), а затем проанализировать результат внутри представления. например,

<%= Html.ActionLink(result.title,"/showresult/" + result.id, "myController") %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...