2010-08-18 4 views
1

Dans une vue MVC2, les balises ne fonctionnent pas du tout. Ils apparaissent comme des images brisées. La balise (créée par une méthode d'extension Html.ImageFor() que j'ai écrit) est une étiquette parfaitement valable, comme celui-ci, que je copiais de la source de la page dans IE:<img> Échec de la balise dans l'application MVC2

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

Notez que si je n » t utilisez la méthode helper, et tapez simplement une balise, avec une URL src correcte, qui se termine également. Si j'utilise une balise à la place, avec la même URL src, cela fonctionne correctement et l'image s'affiche comme prévu.

Donc, pour une raison quelconque, les balises justes ne fonctionnent tout simplement pas pour moi à partir d'une vue MVC2. Je suis très nouveau sur MVC2, mais pas nouveau sur ASP.NET ou Html. Y at-il quelque chose à propos des balises, lorsqu'elles sont utilisées dans une vue MVC2, que je n'ai tout simplement pas encore découvert?

Merci d'avance pour un indice!

+0

Si ce message dit "balises", cela signifie "balises d'image." Je me rends compte maintenant que j'aurais dû les écrire comme <img>, mais je ne savais pas qu'ils seraient dépouillés. –

+0

Sélectionnez le texte. Appuyez sur le bouton "code" au-dessus de l'éditeur (0 et 1). Vos angles seront conservés. –

+0

Pouvez-vous poster le code de votre extension personnalisée? – Fabian

Répondre

3

Votre Html.ImageFor() est endommagé, car src="~/Content/Pictures/IMGP0164 (resized).JPG" n'est pas un URI valide.

Le tilde doit être remplacé par le chemin virtuel du site. Pour ce faire, vous utilisez Url.Content. Puisque vous ne l'avez pas montré la source pour la méthode cassée, je ne peux pas réparer, mais dans le balisage simple vous pouvez écrire:

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

Vous pouvez utiliser la même idée dans votre aide.

+0

Cela semble être une bonne solution, mais je n'ai pas réussi à l'utiliser dans la méthode auxiliaire. Je n'ai trouvé aucun moyen de rendre l'espace de noms Url disponible et l'aide de Microsoft n'est pas très utile dans ce cas. Merci quand même! –

+0

Enfin, ça marche! Merci à l'indice que vous m'avez donné, j'ai modifié le contrôleur pour mettre les chemins dans le modèle en commençant par ../../, et rien d'autre ne devait être changé. Merci encore! –

0

est ici la méthode d'assistance demandée:

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)); 
     }  
    } 
} 
Questions connexes