2010-08-18 55 views
1

在MVC2视图中,我无法让标签工作。他们显示为破碎的图片。标签(由我写一个Html.ImageFor()扩展方法创建的)是一个完全有效的标签,例如这一点,这是我从IE中的页源复制:<img>标签在MVC2应用程序中失败

<img alt="Picture Display" src="~/Content/Pictures/IMGP0164 (resized).JPG" /> 

注意,如果我不不要使用助手方法,只需输入一个标签,并带有一个正确的src URL,最终也会被破坏。如果我使用标签,而使用相同的src网址,那可以正常工作,并且图片按预期显示。

因此,出于某种原因,正义的标签根本不适合我从MVC2视图。我对MVC2非常陌生,但对ASP.NET或Html并不陌生。有没有关于标签的东西,在MVC2视图中使用时,我只是还没有发现?

在此先感谢您的线索!

+0

如果这条消息说的“标签”,这意味着我意识到现在我应该把它们写成<img>,但我没有意识到它们会被剥离。 – 2010-08-18 20:23:33

+0

选择文字。按下编辑器上方的“代码”按钮(0和1)。您的尖括号将被保留。 – 2010-08-18 20:27:29

+0

你可以发布你的自定义扩展的代码吗? – Fabian 2010-08-18 20:29:04

回答

3

您的Html.ImageFor()已损坏,因为src="~/Content/Pictures/IMGP0164 (resized).JPG"不是有效的URI。

代字号必须替换为网站的虚拟路径。为此,请使用Url.Content。既然你还没有表现出对你的破法源,我不能修复它,但在普通的标记,你可以这样写:

<img alt="Picture Display" src="<%= Url.Content("~/Content/Pictures/IMGP0164 (resized).JPG")" /> 

你可以用你的助手里面同样的想法。

+0

这听起来像是一个很好的解决方案,但我一直无法使它在辅助方法中工作。我还没有找到任何方法让Url名称空间在那里可用,而微软的“帮助”在这种情况下不是很有帮助。不过谢谢! – 2010-08-18 21:27:16

+0

终于搞定了!感谢您给我的线索,我修改了控制器,将路径放入以../../开头的模型中,并且不需要更改任何其他内容。再次感谢! – 2010-08-18 21:46:42

0

这里的要求helper方法:“图像标签”

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Web; 
using System.Web.Mvc; 
using PictureThis.Models; 


namespace System.Web.Mvc.Html 
{ 
    public static class ExtensionMethods 
    { 
     // HtmlHelper Extensions 

     /// <summary> 
     /// Builds an Html image element. 
     /// </summary> 
     /// <param name="helper">Required target param</param> 
     /// <param name="src">Source URL attribute</param> 
     /// <param name="alt">Alt text attribute</param> 
     /// <returns></returns> 
     public static MvcHtmlString ImageFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string alt) 
     { 
      TagBuilder tb = new TagBuilder("img"); 
      Delegate GetSource = expression.Compile(); 
      string source = GetSource.DynamicInvoke(html.ViewData.Model).ToString(); 
      tb.Attributes.Add("src", source); 
      tb.Attributes.Add("alt", alt); 
      return MvcHtmlString.Create(tb.ToString(TagRenderMode.SelfClosing)); 
     }  
    } 
}