Domanda

In ASP.NET MVC c'è un equivalente del Html.ActionLink di supporto per i tag Img?

Ho un controller azione che genera dinamicamente generato JPEG e ho voluto usare le stesse espressioni Lambda per il link, come faccio Href utilizzando ActionLink.

In alternativa, un aiuto che dà solo l'URL di un percorso (di nuovo ha specificato l'utilizzo di espressioni Lambda) sarebbe anche accettabile.

MODIFICA:Avevo originariamente specificato che stavo usando Anteprima 5, comunque vedo che la Beta è stata rilasciata.In tutto il numero di versione è stata inutili pezzo di informazioni per quanto io possa essere di aggiornare presto :-)

È stato utile?

Soluzione

Url.Azione() si ottiene l'URL semplice per la maggior parte dei sovraccarichi di Html.ActionLink, ma penso che l'URL-da-lambda funzionalità è disponibile solo attraverso Html.ActionLink finora.Speriamo che aggiungerà un simile sovraccarico di Url.Azione a un certo punto.

Altri suggerimenti

È possibile utilizzare l'URL.Metodo di azione

<a href="<%= Url.Action("Create")  %>"><img src="../../Content/Images/add_48.png" /></a>

Questa domanda è più vecchio, e ho appena iniziato di recente, con ASP.NET MVC quando la RC era già fuori, ma per chi si trova questa domanda più tardi, come me, questo potrebbe essere interessante:

Almeno nella RC è possibile utilizzare l'Url.Azione() anche con tipi anonimi, il risultato appare molto più bello di quanto i suggerimenti di cui sopra, credo che:

<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>

Ci sono molti altri i sovraccarichi per RouteUrl, nonché, naturalmente.

Ho usato una soluzione per inserire un segno al posto del testo per ActionLink e sostituirla con la mia immagine codice.Qualcosa di simile a questo:

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

Non è la soluzione più elegante, ma funziona.

In MVC3, il tuo link sarà simile a questa:

<a href="@Url.Action("Create")"><img src="../../Content/Images/add_48.png" /></a>

In ASP.NET MVC Beta, è possibile utilizzare il Html.BuildUrlFromExpression metodo nel Futures di montaggio (che non è presente di default ASP.NET MVC installare, ma è disponibile CodePlex) per creare un collegamento intorno a un'immagine-o qualsiasi HTML--uso di lambda in stile ActionLink sintassi, come questo:

<a href="<%=Html.BuildUrlFromExpression<MyController>(c => c.MyAction())%>">
     <%=Html.Image("~/Content/MyImage.gif")%>
</a>

Per mantenere i vostri collegamenti di immagine senza bordi, è necessario aggiungere una regola CSS così:

img
{
     border: none;
}

È possibile utilizzare questo controllo.Si comporta come ActionLink.

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

E ' abbastanza semplice per raggiungere in MVC 2.Ho creato il mio estensione molto semplice metodo per supportare le espressioni Lambda per l'Url.Azione di supporto.Si richiede di riferimento MVC 2 Futures.
Ecco il codice:

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

Questo è come lo si utilizza:

<img src="<%= Url.Action<YourController>(c => c.YourActionMethod(param1, param2)); %>" />

So che il mio post è troppo tardi, ma voglio condividere :)

Ho aggiunto il nuovo metodo di estensione qualcosa di simile a questo :

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

Spero che questo ha aiutato.

Url.Contenuti() cosa stai cercando?

Dargli qualcosa come Url.Contenuto("~/path/to/something.jpg" si trasforma nel percorso appropriato basato sulla radice dell'applicazione.

-Josh

Ho preso le risposte di cui sopra e fatto un po ' di un wrapper di estensione:

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

ha reso più facile per me comunque, spero che aiuta qualcun altro.

Ho provato a mettere l'uscita del Html.Immagine nel mio Html.ImageLink helper.

@(new HtmlString(Html.ActionLink(Html.Image("image.gif").ToString(), "myAction", "MyController").ToString().Replace("&lt;", "<").Replace("&gt;", ">")))

Il problema per me è che la ActionLink nome è codificato in modo che ho < invece di <.

Ho appena rimosso questa codifica e il risultato per me funziona.(C'è un modo migliore di fare questo utilizzando invece sostituire?)

In aggiunta agli altri post:nel mio caso (asp.net mvc 3) volevo un link ad immagine di agire come un selettore lingua così ho finito con:

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

L'interiorizzazione di supporto è stato fatto tramite un linguaggio di percorso - fonte originale qui.

Bello qui le soluzioni, ma cosa succede se si desidera avere più di una semplice immagine in actionlink?Questo è come lo faccio:

     @using (Html.BeginForm("Action", "Controler", ajaxOptions))
     { 
        <button type="submit">
           <img src="image.png" />            
        </button>
     }

L'inconveniente è che devo ancora fare un po ' di stile con il pulsante, elemento, ma si può mettere tutto il codice html che si desidera in là.

E funziona con l'Ajax helper così: https://stackoverflow.com/a/19302438/961139

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top