Эквивалент изображения ActionLink в ASP.NET MVC - PullRequest
47 голосов
/ 17 октября 2008

В ASP.NET MVC есть эквивалент помощника Html.ActionLink для тегов Img?

У меня есть действие контроллера, которое выводит динамически сгенерированный JPEG, и я хотел использовать те же лямбда-выражения для ссылки на него, как и для HREF с использованием ActionLink.

В качестве альтернативы, помощник, который просто дает URL-адрес для маршрута (снова заданный с помощью Lambdas) также будет приемлемым.

EDIT : Первоначально я указывал, что использую Preview 5, однако я вижу, что бета-версия была выпущена. Таким образом, в целом номер версии был ненужной информацией, так как я скоро буду обновляться: -)

Ответы [ 14 ]

47 голосов
/ 23 июля 2009

Вы можете использовать URL. Метод действия

<a href="<%= Url.Action("Create")  %>"><img src="../../Content/Images/add_48.png" /></a>
39 голосов
/ 19 февраля 2009

Этот вопрос более старый, и я только недавно начал с 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.

20 голосов
/ 17 октября 2008

Url.Action () даст вам простой URL для большинства перегрузок Html.ActionLink, но я думаю, что функциональность URL-из-лямбды пока доступна только через Html.ActionLink. Надеемся, что в какой-то момент они добавят аналогичную перегрузку в Url.Action.

8 голосов
/ 27 декабря 2008

Я использовал обходной путь для размещения маркера вместо текста для ActionLink, а затем заменил его своим кодом изображения. Примерно так:

<%= Html.ActionLink("__IMAGE_PLACEHOLDER__", "Products").Replace("__IMAGE_PLACEHOLDER__", "<img src=\"" + myImgUrl + "\" />")%>

Не самое элегантное решение, но оно работает.

5 голосов
/ 26 апреля 2011

В MVC3 ваша ссылка будет выглядеть так:

<a href="@Url.Action("Create")"><img src="../../Content/Images/add_48.png" /></a>
4 голосов
/ 21 ноября 2008

В бета-версии 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;
}
3 голосов
/ 12 июня 2009

Вы можете использовать этот элемент управления. Он ведет себя как ActionLink.

http://agilefutures.com/index.php/2009/06/actionimage-aspnet-mvc

2 голосов
/ 16 ноября 2011

Я знаю, что мой пост слишком поздно, но я хочу поделиться:)

Я добавил новый метод расширения примерно так:

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());
    }
}

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

2 голосов
/ 06 мая 2010

Это довольно просто сделать в 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)); %>" />
1 голос
/ 09 июля 2012

Я взял приведенные выше ответы и сделал небольшое расширение:

    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());
        }

мне все равно стало легче, надеюсь, это поможет кому-то еще.

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