Идентификатор изображения ActionLink в ASP.NET MVC
В ASP.NET MVC есть эквивалент помощника Html.ActionLink для тегов Img?
У меня есть действие контроллера, которое выводит динамически сгенерированный JPEG, и я хотел использовать те же Лямбда-выражения для ссылки на него, как я делаю HREF, используя ActionLink.
Альтернативно, хелпер, который просто указывает URL-адрес маршрута (опять же указанный с помощью Lambdas), также будет приемлемым.
EDIT. Я изначально указал, что я использовал Preview 5, однако я вижу, что бета-версия была выпущена. Таким образом, все-в-одном номер версии был ненужным фрагментом информации, поскольку я могу быстро обновить: -)
Ответы
Ответ 1
URL-адрес Url.Action() предоставит вам голый URL-адрес для большинства перегрузок Html.ActionLink, но я думаю, что функция URL-from-lambda доступна только через Html.ActionLink. Надеюсь, они добавят подобную перегрузку в Url.Action в какой-то момент.
Ответ 2
Вы можете использовать метод URL.Action
<a href="<%= Url.Action("Create") %>"><img src="../../Content/Images/add_48.png" /></a>
Ответ 3
Этот вопрос старше, и я только недавно начал работу с ASP.NET MVC, когда RC уже вышел, но для тех, кто этот вопрос позже найдет, как мне, это может быть интересно:
По крайней мере, в RC вы можете использовать Url.Action() также с анонимными типами, результат выглядит намного лучше, чем предложения выше, я думаю:
<a href="<%= Url.RouteUrl("MyRoute", new { param1 = "bla", param2 = 5 }) %>">
put in <span>whatever</span> you want, also <img src="a.gif" alt="images" />.
</a>
Конечно, есть много других перегрузок для RouteUrl.
Ответ 4
Я использовал обходное решение для размещения маркера вместо текста для ActionLink, а затем заменил его кодом изображения. Что-то вроде этого:
<%= Html.ActionLink("__IMAGE_PLACEHOLDER__", "Products").Replace("__IMAGE_PLACEHOLDER__", "<img src=\"" + myImgUrl + "\" />")%>
Не самое элегантное решение, но оно работает.
Ответ 5
В MVC3 ваша ссылка будет выглядеть так:
<a href="@Url.Action("Create")"><img src="../../Content/Images/add_48.png" /></a>
Ответ 6
В бета-версии ASP.NET MVC вы можете использовать метод Html.BuildUrlFromExpression в сборке Futures (который не входит в стандартную установку ASP.NET MVC, но доступен из CodePlex), чтобы создать ссылку вокруг изображения - или любого HTML - используя синтаксис ActionLink в стиле лямбда, например:
<a href="<%=Html.BuildUrlFromExpression<MyController>(c => c.MyAction())%>">
<%=Html.Image("~/Content/MyImage.gif")%>
</a>
Чтобы сохранить ссылки на изображения без полей, вам нужно добавить правило CSS следующим образом:
img
{
border: none;
}
Ответ 7
Вы можете использовать этот элемент управления. Он ведет себя как ActionLink.
http://agilefutures.com/index.php/2009/06/actionimage-aspnet-mvc
Ответ 8
Это довольно просто для достижения в MVC 2. Я создал свой собственный очень простой метод расширения для поддержки лямбда-выражений для помощника Url.Action. Это требует, чтобы вы ссылались на фьючерсы MVC 2.
Здесь код:
using System;
using System.Linq.Expressions;
using System.Web.Mvc;
using System.Web.Routing;
using ExpressionHelperInternal=Microsoft.Web.Mvc.Internal.ExpressionHelper;
namespace Bnv.Bssi.Web.Infrastructure.Helpers
{
public static class UrlExtensions
{
public static string Action<TController>(this UrlHelper helper, Expression<Action<TController>> action) where TController : Controller
{
RouteValueDictionary routeValuesFromExpression = ExpressionHelperInternal.GetRouteValuesFromExpression<TController>(action);
return helper.Action(routeValuesFromExpression["action"].ToString(), routeValuesFromExpression);
}
}
}
Вот как вы его используете:
<img src="<%= Url.Action<YourController>(c => c.YourActionMethod(param1, param2)); %>" />
Ответ 9
Я знаю, что мой пост слишком поздний, но я хочу поделиться:)
Я добавил новый метод расширения примерно так:
public static class ImageExtensions
{
public static MvcHtmlString ImageLink(this HtmlHelper htmlHelper, string imgSrc, string additionalText = null, string actionName = null, string controllerName = null, object routeValues = null, object linkHtmlAttributes = null, object imgHtmlAttributes = null)
{
var urlHelper = ((Controller)htmlHelper.ViewContext.Controller).Url;
var url = "#";
if (!string.IsNullOrEmpty(actionName))
url = urlHelper.Action(actionName, controllerName, routeValues);
var imglink = new TagBuilder("a");
imglink.MergeAttribute("href", url);
imglink.InnerHtml = htmlHelper.Image(imgSrc, imgHtmlAttributes) + " " + additionalText;
linkHtmlAttributes = new RouteValueDictionary(linkHtmlAttributes);
imglink.MergeAttributes((IDictionary<string, object>)linkHtmlAttributes, true);
return MvcHtmlString.Create(imglink.ToString());
}
public static MvcHtmlString Image(this HtmlHelper htmlHelper, string imgSrc, object imgHtmlAttributes = null)
{
var imgTag = new TagBuilder("img");
imgTag.MergeAttribute("src", imgSrc);
if (imgHtmlAttributes != null)
{
imgHtmlAttributes = new RouteValueDictionary(imgHtmlAttributes);
imgTag.MergeAttributes((IDictionary<string, object>)imgHtmlAttributes, true);
}
return MvcHtmlString.Create(imgTag.ToString());
}
}
Надеюсь, что это помогло.
Ответ 10
Является ли Url.Content() то, что вы ищете?
Дайте ему что-то вроде Url.Content( "~/path/to/something.jpg" ), он превратит его в соответствующий путь на основе корня приложения.
-Josh
Ответ 11
Я взял вышеупомянутые ответы и сделал несколько расширений для обертки:
public static MvcHtmlString ActionImageLink(this HtmlHelper helper, string src, string altText, UrlHelper url, string actionName, string controllerName)
{
return ActionImageLink(helper, src, altText, url, actionName, controllerName, null, null);
}
public static MvcHtmlString ActionImageLink(this HtmlHelper helper, string src, string altText, UrlHelper url, string actionName, string controllerName, Dictionary<string, string> linkAttributes, Dictionary<string, string> imageAttributes)
{
return ActionImageLink(helper, src, altText, url, actionName, controllerName, null, linkAttributes, imageAttributes);
}
public static MvcHtmlString ActionImageLink(this HtmlHelper helper, string src, string altText, UrlHelper url, string actionName, string controllerName, dynamic routeValues, Dictionary<string, string> linkAttributes, Dictionary<string, string> imageAttributes)
{
var linkBuilder = new TagBuilder("a");
linkBuilder.MergeAttribute("href", routeValues == null ? url.Action(actionName, controllerName) : url.Action(actionName, controllerName, routeValues));
var imageBuilder = new TagBuilder("img");
imageBuilder.MergeAttribute("src", url.Content(src));
imageBuilder.MergeAttribute("alt", altText);
if (linkAttributes != null)
{
foreach (KeyValuePair<string, string> attribute in linkAttributes)
{
if (!string.IsNullOrWhiteSpace(attribute.Key) && !string.IsNullOrWhiteSpace(attribute.Value))
{
linkBuilder.MergeAttribute(attribute.Key, attribute.Value);
}
}
}
if (imageAttributes != null)
{
foreach (KeyValuePair<string, string> attribute in imageAttributes)
{
if (!string.IsNullOrWhiteSpace(attribute.Key) && !string.IsNullOrWhiteSpace(attribute.Value))
{
imageBuilder.MergeAttribute(attribute.Key, attribute.Value);
}
}
}
linkBuilder.InnerHtml = MvcHtmlString.Create(imageBuilder.ToString(TagRenderMode.SelfClosing)).ToString();
return MvcHtmlString.Create(linkBuilder.ToString());
}
облегчил мне все равно, надеюсь, что это поможет кому-то другому.
Ответ 12
Я попытался поместить вывод Html.Image в мой помощник Html.ImageLink.
@(new HtmlString(Html.ActionLink(Html.Image("image.gif").ToString(), "myAction", "MyController").ToString().Replace("<", "<").Replace(">", ">")))
Проблема для меня в том, что имя ActionLink закодировано, поэтому у меня есть & lt вместо <.
Я просто удалил эту кодировку, и результат работает для меня.
(Есть ли лучший способ сделать это вместо замены?)
Ответ 13
Добавление к другим сообщениям: в моем случае (asp.net mvc 3) Я хотел, чтобы ссылка на изображение выступала в качестве языкового селектора, поэтому я закончил с:
public static MvcHtmlString ImageLink(this HtmlHelper htmlHelper, string imgSrc, string cultureName, object htmlAttributes, object imgHtmlAttributes, string languageRouteName = "lang", bool strictSelected = false)
{
UrlHelper urlHelper = ((Controller)htmlHelper.ViewContext.Controller).Url;
TagBuilder imgTag = new TagBuilder("img");
imgTag.MergeAttribute("src", imgSrc);
imgTag.MergeAttributes((IDictionary<string, string>)imgHtmlAttributes, true);
var language = htmlHelper.LanguageUrl(cultureName, languageRouteName, strictSelected);
string url = language.Url;
TagBuilder imglink = new TagBuilder("a");
imglink.MergeAttribute("href", url);
imglink.InnerHtml = imgTag.ToString();
imglink.MergeAttributes((IDictionary<string, string>)htmlAttributes, true);
//if the current page already contains the language parameter make sure the corresponding html element is marked
string currentLanguage = htmlHelper.ViewContext.RouteData.GetRequiredString("lang");
if (cultureName.Equals(currentLanguage, StringComparison.InvariantCultureIgnoreCase))
{
imglink.AddCssClass("selectedLanguage");
}
return new MvcHtmlString(imglink.ToString());
}
Поддержка интернализации была выполнена через языковой маршрут - исходный источник здесь.
Ответ 14
Хорошие решения здесь, но что, если вы хотите иметь больше, чем просто изображение в actionlink? Вот как я это делаю:
@using (Html.BeginForm("Action", "Controler", ajaxOptions))
{
<button type="submit">
<img src="image.png" />
</button>
}
Недостатком является то, что мне еще нужно немного стилизовать элемент кнопки, но вы можете поместить весь html, который вам нужен.
И он также работает с помощником Ajax: fooobar.com/info/78863/...