我有一把剃刀" @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扩展性钩子中得到的东西。
答案 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)