47

在 ASP.NET MVC 中是否有与 Img 标记的 Html.ActionLink 帮助器等效的工具?

我有一个输出动态生成的 JPEG 的控制器操作,我想使用相同的 Lambda 表达式链接到它,就像我使用 ActionLink 执行 HREF 一样。

或者,仅将 URL 提供给路由(再次使用 Lambda 指定)的助手也是可以接受的。

编辑:我最初指定我使用的是预览版 5,但是我看到已经发布了一个 Beta。所以总的来说,版本号是一条不需要的信息,因为我可能很快就会升级:-)

4

14 回答 14

47

您可以使用 URL.Action 方法

<a href="<%= Url.Action("Create")  %>"><img src="../../Content/Images/add_48.png" /></a>
于 2009-07-23T15:33:55.027 回答
39

这个问题比较老,我最近刚开始使用 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 还有许多其他重载。

于 2009-02-19T16:20:30.207 回答
20

Url.Action() 将为您提供大多数 Html.ActionLink 重载的裸 URL,但我认为 URL-from-lambda 功能目前只能通过 Html.ActionLink 获得。希望他们会在某个时候为 Url.Action 添加类似的重载。

于 2008-10-17T01:02:40.943 回答
8

我使用了一种解决方法来为 ActionLink 放置一个标记而不是文本,然后用我的图像代码替换它。像这样的东西:

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

不是最优雅的解决方案,但它有效。

于 2008-12-27T10:26:39.350 回答
5

在 MVC3 中,您的链接将如下所示:

<a href="@Url.Action("Create")"><img src="../../Content/Images/add_48.png" /></a>
于 2011-04-25T20:44:39.553 回答
4

在 ASP.NET MVC Beta 中,您可以使用 Futures 程序集中的Html.BuildUrlFromExpression方法(该方法不包含在默认的 ASP.NET MVC 安装中,但可从CodePlex获得)围绕图像创建链接 - 或任何HTML——使用 lambda 样式的 ActionLink 语法,如下所示:

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

为了让你的图片链接保持无边界,你需要像这样添加一个 CSS 规则:

img
{
     border: none;
}
于 2008-11-21T16:44:46.797 回答
3

您可以使用此控件。它的行为类似于 ActionLink。

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

于 2009-06-12T13:17:13.203 回答
2

在 MVC 2 中实现它非常简单。我创建了自己的非常简单的扩展方法来支持 Url.Action 帮助器的 Lambda 表达式。它要求您引用 MVC 2 Futures。
这是代码:

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)); %>" />
于 2010-05-06T05:33:19.047 回答
2

我知道我的帖子太晚了,但我想分享:)

我添加了类似这样的新扩展方法:

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

希望这有帮助。

于 2011-11-16T02:11:37.707 回答
1

Url.Content() 是您要查找的内容吗?

给它类似 Url.Content("~/path/to/something.jpg") 它会根据应用程序根目录将其转换为适当的路径。

-乔什

于 2009-06-17T16:44:09.243 回答
1

我接受了上述答案并做了一些包装扩展:

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

无论如何,这对我来说更容易,希望它可以帮助别人。

于 2012-07-09T12:08:49.647 回答
0

我试图将 Html.Image 的输出放入我的Html.ImageLink助手中。

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

对我来说问题是,ActionLink 名称是编码的,所以我有 < 而不是 <。

我刚刚删除了这个编码,结果对我有用。(有没有更好的方法来代替使用替换?)

于 2011-01-08T13:13:31.710 回答
0

添加到其他帖子:在我的情况下(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());
        }

内部化支持是通过语言路径完成的——这里的原始源。

于 2012-07-17T11:06:18.930 回答
0

这里有很好的解决方案,但是如果你想在 actionlink 中拥有更多的图像呢?我就是这样做的:

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

缺点是我仍然需要对按钮元素进行一些样式设置,但是您可以将所有想要的 html 放在那里。

它也适用于 Ajax 助手:https ://stackoverflow.com/a/19302438/961139

于 2013-10-10T17:40:13.960 回答