ASP.NET MVC中ActionLink的图像等效物

47
在ASP.NET MVC中,是否有与Html.ActionLink助手相当的Img标记的等效助手?
我有一个控制器操作,输出动态生成的JPEG图像,并希望使用相同的Lambda表达式链接到它,就像使用ActionLink链接HREF一样。
或者,一个只提供路由URL(再次使用Lambda指定)的助手也是可以接受的。
编辑:我最初指定我正在使用Preview 5,但我看到已发布了Beta版本。所以总的来说,版本号是不必要的信息,因为我可能很快会升级 :-)
14个回答

47

你可以使用URL.Action方法

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

这个很棒!只需传入操作和控制器,它就像魔法一样运行了!谢谢。 - SavoryBytes
@RichardEverett,那么如何使用Razor @?您介意提供一个简单的演示代码吗? - Carlos Liu
<%= Url.Action("Create") %> 改为 @Url.Action("Create") - Richard Ev

39

这个问题比较旧,当 ASP.NET MVC RC 版本已经发布时我才刚开始学习 ASP.NET MVC。但对于像我这样后来者的人来说,这可能是有趣的:

至少在 RC 版中,您可以使用匿名类型(anonymous types)调用 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

Url.Action()可以为大多数Html.ActionLink的重载获取裸URL,但我认为来自lambda的URL功能目前仅可通过Html.ActionLink获得。希望他们在某个时候添加类似于Url.Action的重载。


解析 Lambda 功能在 MvcToolkit 中是一个很方便的方法,只是它是内部的。你可以添加自己的扩展方法,通过反射调用它(或重新编译 MvcToolkit 使其公开),假设官方的方法很快就会替换它。 - stevemegson
如果你将它制作成一个好的扩展方法(比如:Html.ActionImage()),它就不会使你的视图混乱 :) - Erik van Brakel

8

我使用了一个解决方法来代替ActionLink中的文本,用我的图片代码替换它。类似这样:

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

不是最优雅的解决方案,但可以正常运作。

这就是我正在做的事情,除了我有一个用于构建img标签的扩展方法。将其封装在扩展方法中会很棒,我可能会这样做。 - Chris Charabaruk

5
在MVC3中,您的链接将如下所示:
<a href="@Url.Action("Create")"><img src="../../Content/Images/add_48.png" /></a>

4
当然,如果可能的话,请不要忘记为img元素添加alt属性。 - Pure.Krome

4
在ASP.NET MVC Beta中,您可以使用未来程序集(默认情况下未包含在ASP.NET MVC安装中,但可从CodePlex获得)中的Html.BuildUrlFromExpression方法,以lambda样式的ActionLink语法创建围绕图像或任何HTML的链接,如下所示:
<a href="<%=Html.BuildUrlFromExpression<MyController>(c => c.MyAction())%>">
     <%=Html.Image("~/Content/MyImage.gif")%>
</a>

为了保持您的图像链接无边框,您需要添加类似于以下的CSS规则:
img
{
     border: none;
}

3

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

希望这有所帮助。

2

在MVC 2中实现这个很简单。我创建了一个非常简单的扩展方法来支持Lambda表达式的Url.Action辅助程序。需要引用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)); %>" />

1

你是在寻找 Url.Content() 吗?

如果你像这样给它一个路径 Url.Content("~/path/to/something.jpg"),它将根据应用程序根目录将其转换为适当的路径。

-Josh


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接