扩展HtmlHelper类asp.net mvc4

时间:2015-04-15 10:18:42

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我在扩展HtmlHelper类以呈现图像标记时遇到问题

我刚写了这段代码

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才会显示扩展方法。

所以请任何人帮我解决我的问题。

3 个答案:

答案 0 :(得分:2)

你必须像这样返回IHtmlString,以便它呈现为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));   
  }

答案 1 :(得分:2)

您应该从HtmlHelper扩展方法返回IHtmlString,以便输出不是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));   
}

要修复所有视图中可用的方法,您需要将类的命名空间添加到Views文件夹中的web.config。

答案 2 :(得分: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