2011-01-16 10 views
11

Sto provando a portare il vecchio helper HTML.Image, che sono sicuro che tutti hanno usato in un punto o nell'altro, e sto avendo problemi. Di seguito compila bene:Helpers per rasoio e HTML

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

Ma quando cerco di usarlo in una vista scrive semplicemente:

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

e non visualizza l'immagine. Qualcuno può aiutare?

Ecco il codice di supporto HTML.Image che sto usando: motore di visualizzazione

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

} 

risposta

17

The Razor automaticamente stringhe HTML-escape resi da @ -blocks.
Per eseguire il rendering dell'HTML, è necessario scrivere un'implementazione IHtmlString nel blocco @.

Modificare il metodo per restituire HtmlString anziché string.

+0

uomo eccezionale. Grazie. Lo apprezzo molto. Controllerò la risposta corretta non appena l'overflow dello stack mi consentirà ... dice che devo aspettare. – jsteve81

1

vorrei provare avvolgendo l'URL dell'immagine in una chiamata al metodo Content URL, in modo

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

che dovrebbe convertire l'URL relativo ad assoluto quando la pagina viene svuotata al browser

+0

Stai fraintendendo il problema. – SLaks

+0

Sì, hai ragione. Scriverà semplicemente il letterale nel modo in cui lo ha avuto – 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; 
    } 

proprio come questo è stato testato e funziona perfettamente. avevo bisogno di qualcosa del genere per concatenare il nome dell'immagine del modello grazie.

e anche questo funziona.

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

Ho avuto lo stesso problema e che avevo usato MvcHtmlString come tipo restituito per queste metodo 2 di estensione e funziona

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)); 
    } 
} 
Problemi correlati