Question

Dans ASP.NET MVC est-il un équivalent de l'Html.ActionLink d'assistance pour les balises Img?

J'ai une action de contrôleur des sorties généré dynamiquement, un JPEG et j'ai voulu utiliser les mêmes expressions Lambda lien vers celui-ci que je ne HREFs à l'aide de ActionLink.

Sinon, un assistant, qui donne juste l'URL de la route (encore une fois spécifié à l'aide de Lambda) serait également acceptable.

MODIFIER:J'avais initialement spécifié que j'étais en utilisant l'Extrait 5, cependant je vois que d'une version Bêta a été libéré.Donc, en somme, le numéro de version est une inutiles morceau de l'info, comme je l'ai peut être mise à jour bientôt :-)

Était-ce utile?

La solution

Url.Action() vous obtiendrez le nu URL pour la plupart des surcharges de Html.ActionLink, mais je pense que l'URL-de-lambda fonctionnalité est seulement disponible via Html.ActionLink jusqu'à présent.Espérons qu'ils vont ajouter une telle surcharge de l'Url.Action à un certain point.

Autres conseils

Vous pouvez utiliser l'URL.Méthode d'Action

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

Cette question est plus ancienne, et j'ai commencé récemment avec ASP.NET MVC lorsque le RC était déjà, mais pour ceux qui trouve cette question un peu plus tard comme moi, cela peut être intéressant:

Au moins dans le RC, vous pouvez utiliser l'Url.Action() également avec les types anonymes, le résultat est beaucoup plus agréable que les suggestions ci-dessus, je suppose:

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

Il existe de nombreuses autres surcharges pour RouteUrl aussi, bien entendu.

J'ai utilisé une solution de contournement pour placer un marqueur au lieu de texte pour ActionLink et puis le remplacer par mon image de code.Quelque chose comme ceci:

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

Pas la solution la plus élégante, mais il fonctionne.

Dans MVC3, votre lien devrait ressembler à ceci:

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

Dans ASP.NET MVC Bêta, vous pouvez utiliser le Html.BuildUrlFromExpression méthode dans l'avenir de l'assemblée (qui n'est pas inclus dans la valeur par défaut ASP.NET MVC installer, mais est disponible à partir de CodePlex) pour créer un lien autour d'une image, ou tout code HTML--à l'aide de la lambda-style ActionLink syntaxe, comme ceci:

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

Pour garder vos liens d'image sans bordure, vous aurez besoin d'ajouter une règle CSS comme ceci:

img
{
     border: none;
}

Vous pouvez utiliser cette commande.Il se comporte comme ActionLink.

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

C'est assez simple à réaliser en MVC 2.J'ai créé mon propre très simple méthode d'extension pour support des expressions Lambda pour l'Url.D'aide d'Action.Il exige que vous référence MVC 2 contrats à Terme.
Voici le code:

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

C'est la façon dont vous l'utiliser:

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

Je sais que mon post est trop tard, mais j'ai envie de partager :)

J'ai ajouté une nouvelle extension de la méthode à quelque chose comme ceci :

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

Espérons que cela a aidé.

Est Url.Contenu() ce que vous recherchez?

Lui donner quelque chose comme Url.Contenu("~/path/to/something.jpg") il va se mettre dans le chemin d'accès basé sur la racine de l'application.

-Josh

J'ai pris les réponses ci-dessus et fait un peu d'un wrapper de l'extension:

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

il est plus facile pour moi en tout cas, j'espère que ça aide quelqu'un d'autre.

J'ai essayé de mettre la sortie de la Html.Image dans mon Html.ImageLink helper.

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

Le problème pour moi est que le ActionLink nom est codé j'ai donc < au lieu de <.

J'ai juste enlevé le codage et le résultat fonctionne pour moi.(Est-il une meilleure manière de faire ceci au lieu d'utiliser le remplacer?)

Les ajouter aux autres postes:dans mon cas (asp.net mvc 3) je voulais un lien de l'image à agir comme un sélecteur de langue donc j'ai fini avec:

  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'internalisation de soutien a été fait par un chemin de la langue - source d'origine ici.

Nice solutions ici, mais si vous voulez avoir plus que juste une image dans le actionlink?C'est comment je le fais:

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

L'inconvénient est que je dois encore faire un peu de style sur le bouton-élément, mais vous pouvez mettre tout le code html que vous voulez là-bas.

Et il fonctionne avec l'Ajax helper ainsi: https://stackoverflow.com/a/19302438/961139

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top