如何在HtmlHelper扩展方法中查找文件

时间:2014-05-21 19:59:18

标签: c# asp.net asp.net-mvc

我有一把剃刀&#34; @Mvc&#34;一种扩展方法,用于创建包含在<img>标记中的<a>标记。我想增强它以从指定的图像文件中提取图像尺寸(使用服务器相对路径指定,例如"~/images/image.png")。

我的扩展是在与我的ASP.NET项目分开的类库中的类中实现的。我试图弄清楚如何将服务器相对路径转换为我可以用来在扩展方法执行时打开文件的路径。

这是代码。引用变量img的行是新添加和未经测试的;尝试获取localPath的行不起作用(我没想到会这样做)。

/// <summary>
/// Returns an image (img) element that contains an anchor (a) element
/// that contains the virtual path of the specified action.
/// </summary>
/// <param name="html"> The HtmlHelper class being extended. </param>
/// <param name="imagePath"> The path to the image. </param>
/// <param name="alt"> The "alt" text. </param>
/// <param name="actionName"> The name of the action method. </param>
/// <param name="controllerName"> The name of the controller. </param>
/// <returns> The HTML markup. </returns>
public static MvcHtmlString ActionImage(
    this HtmlHelper html, string imagePath, string alt,
    string actionName, string controllerName)
{
    // Get the UrlHelper
    var url = new UrlHelper(html.ViewContext.RequestContext);

    // Get an Image object from the image file
    var localPath = url.Content(imagePath); // <-- This doesn't work !!!
    var img = System.Drawing.Image.FromFile(localPath);

    // Build the <img> tag
    var imgBuilder = new TagBuilder("img");
    imgBuilder.MergeAttribute("src", url.Content(imagePath));
    imgBuilder.MergeAttribute("alt", alt);
    imgBuilder.MergeAttribute("width", img.Width.ToString());
    imgBuilder.MergeAttribute("height", img.Height.ToString());
    string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);

    // Build the <a> tag
    var anchorBuilder = new TagBuilder("a");
    anchorBuilder.MergeAttribute("href", url.Action(actionName, controllerName));
    anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
    string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);

    return MvcHtmlString.Create(anchorHtml);
}

此代码在Razor视图中引用为:

@Html.ActionImage("~/Images/MyImage.png", "My 'alt' text", "Index", "Home")
编辑:我觉得如果我真的想这样做,我需要挖掘调用者的Visual Studio项目文件的路径,并将其与我的代码中的localPath变量结合起来产生完整的路径。这闻起来像我可以从VS扩展性钩子中得到的东西。

2 个答案:

答案 0 :(得分:2)

使用HttpserverUtility.MapPath method映射物理服务器路径的相对路径:

var localPath = HttpContext.Current.Server.MapPath(imagePath);

而不是:

var localPath = url.Content(imagePath);

带有图像的Content目录应存在于服务器上的项目目录中。如果您在visual studio中将属性复制图像设置为输出目录,则会自动创建指定图像。

答案 1 :(得分:0)

使用:

var localPath = html.ViewContext.HttpContext.Server.MapPath(imagePath)