Как использовать 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") %>