Dans ASP.NET MVC, existe-t-il un équivalent de l'assistant Html.ActionLink pour les balises Img?
J'ai une action de contrôleur qui génère un JPEG généré dynamiquement et je voulais utiliser les mêmes expressions Lambda pour y créer un lien que pour les HREF à l'aide d'ActionLink.
Alternativement, un assistant qui donne simplement l'URL à une route (à nouveau spécifié en utilisant Lambdas) serait également acceptable.
EDIT : J'avais initialement spécifié que j'utilisais Preview 5, mais je vois qu'une version bêta a été publiée. Donc, dans l'ensemble, le numéro de version était une information inutile car je suis peut-être en train de mettre à niveau bientôt :-)
Url.Action () vous fournira l'URL nue pour la plupart des surcharges de Html.ActionLink, mais je pense que la fonctionnalité URL-from-lambda n'est disponible que via Html.ActionLink jusqu'à présent. J'espère qu'ils ajouteront une surcharge similaire à Url.Action à un moment donné.
Vous pouvez utiliser la méthode URL.Action
<a href="<%= Url.Action("Create") %>"><img src="../../Content/Images/add_48.png" /></a>
Cette question est plus ancienne, et je viens de commencer récemment avec ASP.NET MVC alors que le RC était déjà sorti, mais pour ceux qui trouveront cette question plus tard comme moi, cela pourrait être intéressant:
Au moins dans le RC, vous pouvez également utiliser Url.Action () avec des types anonymes, le résultat semble 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>
Bien entendu, il existe de nombreuses autres surcharges pour RouteUrl.
J'ai utilisé une solution de contournement pour placer un marqueur au lieu du texte pour ActionLink, puis le remplacer par mon code d'image. Quelque chose comme ça:
<%= Html.ActionLink("__IMAGE_PLACEHOLDER__", "Products").Replace("__IMAGE_PLACEHOLDER__", "<img src=\"" + myImgUrl + "\" />")%>
Pas la solution la plus élégante mais ça marche.
Dans MVC3, votre lien ressemblerait à ceci:
<a href="@Url.Action("Create")"><img src="../../Content/Images/add_48.png" /></a>
Dans ASP.NET MVC Beta, vous pouvez utiliser la méthode Html.BuildUrlFromExpression dans Futures Assembly (qui n'est pas incluse dans l'installation ASP.NET MVC par défaut) , mais est disponible à partir de CodePlex ) pour créer un lien autour d'une image - ou de tout code HTML - en utilisant la syntaxe ActionLink de style lambda, 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 devrez ajouter une règle CSS comme celle-ci:
img
{
border: none;
}
Vous pouvez utiliser ce contrôle qui se comporte comme ActionLink.
http://agilefutures.com/index.php/2009/06/actionimage-aspnet-mvc
C'est assez simple à réaliser dans MVC 2. J'ai créé ma propre méthode d'extension très simple pour prendre en charge les expressions Lambda pour l'aide Url.Action. Il vous faut référencer MVC 2 Futures.
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);
}
}
}
Voici comment vous l'utilisez:
<img src="<%= Url.Action<YourController>(c => c.YourActionMethod(param1, param2)); %>" />
Je sais que mon message est trop tard mais je veux partager :)
J'ai ajouté une nouvelle méthode d'extension 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());
}
}
J'espère que cela vous a aidé.
Est-ce que Url.Content () est ce que vous cherchez?
Donnez-lui quelque chose comme Url.Content ("~/chemin/vers/quelque chose.jpg"), il le transformera en chemin approprié en fonction de la racine de l'application.
-Josh
J'ai pris les réponses ci-dessus et fait un peu une extension de wrapper:
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());
}
ça m'a facilité la tâche de toute façon, j'espère que ça aide quelqu'un d'autre.
J'ai essayé de mettre la sortie de Html.Image dans mon Html.ImageLink helper.
@(new HtmlString(Html.ActionLink(Html.Image("image.gif").ToString(), "myAction", "MyController").ToString().Replace("<", "<").Replace(">", ">")))
Le problème pour moi est que le nom ActionLink est codé, donc j'ai & lt au lieu de <.
Je viens de supprimer cet encodage et le résultat fonctionne pour moi. (Existe-t-il une meilleure façon de procéder à la place de remplacer?)
Ajout aux autres articles: dans mon cas (asp.net mvc 3), je voulais qu'un lien d'image agisse comme un sélecteur de langue, donc je me suis retrouvé 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());
}
La prise en charge de l'internalisation a été effectuée via une route de langue - source originale ici .