Как использовать ASP.NET MVC Html Helpers из пользовательского помощника?

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

Как мне получить доступ к удобным существующим помощникам вида из моего настраиваемого помощника? То есть в моем помощнике пользовательского вида я хотел бы использовать 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.

Ответ 1

Этот пример должен помочь вам. Этот помощник отображает другой текст ссылки в зависимости от того, зарегистрирован ли пользователь или нет. Он демонстрирует использование 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(...

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

Ответ 2

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

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

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

    }

Ответ 3

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

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

Ответ 4

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

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

<%= Html.ActionLink(result.title,"/showresult/" + result.id, "myController") %>