2015-04-15 2 views
1

У меня есть проблема с расширением класса HtmlHelper, чтобы сделать изображение тегаРасширения HtmlHelper класса asp.net mvc4

Я просто написал этот код

namespace Mace_CrmSystem 
{ 
    public static class ExtendedHelper 
    { 
     public static TagBuilder HaidarImage(this HtmlHelper instance, string src) { 
      TagBuilder inst = new TagBuilder("img"); 
      inst.MergeAttribute("src", src); 
      return inst;  
     } 
    } 
} 

и в индексном я написал этот код

@Html.HaidarImage("http://haidar.ws/wp-content/uploads/2014/07/ipaduse.jpg"); 

, но проблема в том, что когда вид визуализации метки, это не делает его в качестве тега Hrml, а это делает его как обычный текст, так что результат будет так

<img src="http://haidar.ws/wp-content/uploads/2014/07/ipaduse.jpg"></img>; 

еще одна проблема в том, что я пытался добавить пространство имен внутри страницы web.config будут доступны по всей странице, но IntelliSense не показывает расширенный метод, пока явно не объявить его на самой странице просмотра.

поэтому, пожалуйста, кто-нибудь может помочь мне решить мою проблему.

+0

Измените метод на 'public static MvcHtmlString HaidarImage (..)' и добавьте 'return MvcHtmlString.Create (inst.ToString());' –

ответ

2

Вы должны вернуть IHtmlString из метода расширения HtmlHelper, так что выход не HTML закодированы, как это HTML разметка которые не должны быть закодированы снова. Например

public static IHtmlString HaidarImage(this HtmlHelper instance, string src) 
{ 
    TagBuilder inst = new TagBuilder("img"); 
    inst.MergeAttribute("src", src); 
    return new HtmlString(inst.ToString(TagRenderMode.SelfClosing)); 
} 

Чтобы зафиксировать способ быть доступным во всех видах, необходимо добавить пространство имен класса в web.config внутри папки Views.

+0

Отличный ответ, спасибо, что исправил мою проблему, но я нашел урока в pluralSight, который описывает расширение, используя класс TagBuilder, и точно так же, как я написал свой код, поэтому я не знаю, работало ли это в предыдущей версии mvc, прежде чем они выпустили новую версию mvc. – Moh

2

Вы должны вернуть IHtmlString, как это так, что он rendred в Html:

public static IHtmlString HaidarImage(this HtmlHelper instance, string src) 
{ 

    TagBuilder inst = new TagBuilder("img"); 
    inst.MergeAttribute("src", src); 
    return MvcHtmlString.Create(inst.ToString(TagRenderMode.SelfClosing)); 
    } 
2

Я не знаю, почему вы возвращаете TagBuilder из метода, вы должны возвращаться MvcHtmlString вместо этого, попробуйте следующее: -

public static MvcHtmlString HaidarImage(this HtmlHelper helper, string src) 
{ 
    TagBuilder tag = new TagBuilder("img"); 
    tag.Attributes.Add("src", src); 
    return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing)); 
} 

Почему мы должны MvcHtmlString, вы можете прочитать его here.