2011-01-16 20 views
11

Ich versuche, den alten HTML.Image-Helfer zu portieren, von dem ich sicher bin, dass jeder ihn irgendwann benutzt hat, und ich habe Probleme. Die folgende kompiliert fein:Razor und HTML-Helfer

@Html.Image("my-id", "~/Content/my-img.png", "Alt Text") 

Aber wenn ich versuche, es in einer Ansicht zu verwenden, um es einfach schreibt:

<img alt="Alt Text" id="my-id" src="/content/my-img.png" /> 

Und das Bild nicht angezeigt wird. Kann jemand helfen?

Hier ist der HTML.Image Helfer-Code, ich verwende:

public static class ImageHelper 
{ 
    public static string Image(this HtmlHelper helper, string id, string url, string alternateText) 
    { 
     return Image(helper, id, url, alternateText, null); 
    } 

    public static string Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes) 
    { 
     // Instantiate a UrlHelper 
     var urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 

     // Create tag builder 
     var builder = new TagBuilder("img"); 

     // Create valid id 
     builder.GenerateId(id); 

     // Add attributes 
     builder.MergeAttribute("src", urlHelper.Content(url)); 
     builder.MergeAttribute("alt", alternateText); 
     builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 

     // Render tag 
     var ret = new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing)); 
     return ret.ToHtmlString(); 
    } 

} 

Antwort

17

Die Razor-Ansicht-Engine wird automatisch HTML-Escape-Strings von @ -Blöcke gemacht.
Um den tatsächlichen HTML-Code darzustellen, müssen Sie eine IHtmlString Implementierung in den @-Block schreiben.

ändern Methode HtmlString statt string zurückzukehren.

+0

Ehrfürchtiges Mann. Vielen Dank. Ich schätze es sehr. Ich überprüfe die richtige Antwort, sobald der Stapelüberlauf mich ... lässt, dass ich warten muss. – jsteve81

1

ich versuchen würde, die Bild-URL in einem Aufruf URL Content Methode Einwickeln als so

@Url.Content("~/Content/my-img.png") 

, die die relative URL absolute umwandeln soll, wenn die Seite an den Browser gespült wird

+0

Sie missverstehen das Problem. – SLaks

+0

Ja, du hast Recht. Es würde einfach das Literal so schreiben, wie er es hatte – Hakeem

3
public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText) 
    { 
     return Image(helper, id, url, alternateText, null); 
    } 

    public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes) 
    { 
     // Instantiate a UrlHelper 
     var urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 

     // Create tag builder 
     var builder = new TagBuilder("img"); 

     // Create valid id 
     builder.GenerateId(id); 

     // Add attributes 
     builder.MergeAttribute("src", urlHelper.Content(url)); 
     builder.MergeAttribute("alt", alternateText); 
     builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 

     // Render tag 
     var ret = new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing)); 

     return ret; 
    } 

genau so getestet und funktioniert perfekt. Ich brauchte so etwas, um den Bildnamen aus dem Modell zu verketten.

und das funktioniert auch.

<img src="@Url.Content("~/Content/Images/Flags/" + c.CountryCode + ".jpg") " alt=""/> 
0

hatte ich das gleiche Problem, und ich MvcHtmlString als Rückgabetyp für diese 2-Extension-Methode benutzt hatte und es funktioniert

public static class ImageHelper 
{ 
    public static MvcHtmlString Image(this HtmlHelper helper, string id, string url, string alternateText) 
    { 
     return Image(helper, id, url, alternateText, null); 
    } 

    public static MvcHtmlString Image(this HtmlHelper helper, string id, string url, string alternateText, 
           object htmlAttributes) 
    { 
     var builder = new TagBuilder("img"); 

     builder.GenerateId(id); 

     builder.MergeAttribute("alt", alternateText); 
     builder.MergeAttribute("src",url); 

     builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 

     return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing)); 
    } 
}