2009-02-03 15 views

Respuesta

45

necesidad de escribir su propia cuenta o utilizar el método Url.Content() para establecer el atributo de origen. O puedes usar el mío. :-)

public static class HtmlHelperExtensions 
{ 

    public static string Image(this HtmlHelper helper, 
           string url, 
           string altText, 
           object htmlAttributes) 
    { 
     TagBuilder builder = new TagBuilder("img"); 
     builder.Attributes.Add("src", url); 
     builder.Attributes.Add("alt", altText); 
     builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     return builder.ToString(TagRenderMode.SelfClosing); 
    } 
} 

Uso:

<%= Html.Image(Url.Content("~/Content/images/img.png"), 
       "alt text", 
       new { id = "myImage", border = "0" }) 
%> 

EDITAR: Desde que escribí esto me he ido lejos de usarlo. Dejaré la respuesta aquí, aunque para la posteridad. Aunque creo que el método del ensamblado Future es una opción razonable, me encuentro simplemente usando la etiqueta de imagen con la url proporcionada por un UrlHelper. Cuando refactored mis ayudantes en una biblioteca independiente, este no hizo el corte. Volveré a evaluar si se convierte en la biblioteca MVC (no futura).

<img src="<%= Url.Content("~/content/...") %>" 
    alt="alt text" 
    class="has-border" /> 
+1

why aren't you using Futures? http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24142 –

+0

1) I honestly didn't see it in futures when I wrote it and 2) I can depend on mine not being removed. If/when it makes it into the release, I'll change and use it. – tvanfosson

+1

Perhaps I should get Resharper. Meanwhile, be sure to add using System.Web.Mvc; using System.Web.Routing; –

4

¿Qué pasa con HTML puro?

<img src="" alt="" /> 

Se puede usar la colección o modelo ViewData a llenar el atributo src:

<img src="<%= ViewData["ImageSource"] %>" alt="" /> 

<img src="<%= ViewData.Model.ImageSource %>" alt="" /> 

Editar:

cuanto a uso de URLs relativas (es decir, utilizando el carácter "~") en la ruta , cambie el código anterior para usar ResolveUrl. Por ejemplo:

<img src="<%= ResolveUrl(ViewData.Model.ImageSource) %>" alt="" /> 
+1

cuál es incorrecto? falta de verbosidad, incapacidad para encontrar fácilmente cada lugar donde usó una imagen con una búsqueda, más difícil cambiar la implementación si, por ejemplo, decide usar amazon S3 y desea reescribir las URL –

+1

Puedo ver cómo sería más difícil buscar sus imágenes, pero no veo cómo esto es menos detallado que una etiqueta Html.Image que tendría esencialmente la misma información. Tampoco veo cómo es más difícil cambiar esta implementación (a menos que su queja sea la búsqueda nuevamente). –

+1

+1 Porque aún recuerdo cómo escribir HTML. Búsqueda de código para " EthanB

-1

Si necesita hacer referencia a una imagen en, por ejemplo, la carpeta ~/Content/images/, puede fácilmente ser hecho con sólo HTML plano:

<img src="/Content/image/mypic.png" alt="a picture available anywhere" /> 

El truco es el "/" en el comienzo del atributo src, que le indicará al navegador que comience a buscar carpetas en la raíz del sitio. Como ASP.NET MVC de forma predeterminada no analiza las URL de ruta en los archivos que existen en el servidor, el archivo se recuperará de la forma habitual. Esto también funciona en la vista Index del controlador Home independientemente de si usted tiene la url http://www.example.com/, http://www.example.com/Home o http://www.example.com/Home/Index

+3

This won't work if you application is running in a virtual directory. –

+0

Garry's correct. I would recommend going with my ResolveUrl method to handle all cases, but if this works for you then that's fine too. –

+1

use MVC futures : http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24142 –

2

Su en MVC futuros, que están actualizando con cada lanzamiento.

futuros RC2 está aquí: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24142

No se sienta culpable por el uso de algo en los futuros ''. No va a ninguna parte, e incluso si alguna vez tuviste acceso a la fuente.

Tienes que ser un poco cauteloso sobre algunas cosas en futuros (en caso de que desaparezcan) pero puedes estar bastante seguro de que Image helper no va a ninguna parte.

+1

En general, las cosas solo" desaparecen "de la biblioteca MVC Futures cuando se mueven al espacio de nombres System.Web.MVC principal. –

4

Ahora podemos devolver MvcHtmlString.

public static MvcHtmlString Image(this HtmlHelper helper, string url, string altText, object htmlAttributes) 
     { 
      TagBuilder builder = new TagBuilder("img"); 
      builder.Attributes.Add("src", url); 
      builder.Attributes.Add("alt", altText); 
      builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
      return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal)); 
     } 

el uso de la maquinilla de afeitar:

@Html.Image(Url.Content("~/Content/images/img.png"), 
       "alt text", 
       new { id = "myImage", border = "0" }) 
+0

Lo necesita con una navaja de afeitar; Otra implementación solo funciona en ASP.Net antiguo –

Cuestiones relacionadas