【问题标题】:MVC Html Extension return string instead of html markup?MVC Html 扩展返回字符串而不是 html 标记?
【发布时间】:2011-05-04 19:31:37
【问题描述】:

如果我有这样的扩展名:

 public static string ImageLink(this HtmlHelper htmlHelper,
                                      string imgSrc, 
                                      string alt, 
                                      string actionName,
                                      string controllerName, 
                                      object routeValues, 
                                      object htmlAttributes, 
                                      object imgHtmlAttributes)
  {

     return @"<img src=""../../Content/images/english.png"" /> ";
  }

我在这样的局部视图中使用它:

@Html.ImageLink("../../Content/images/english.png","English", "ChangeCulture", "Account", new { lang = "en", returnUrl = this.Request.RawUrl }, null,null)

我有这样的输出:

知道为什么吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 razor


    【解决方案1】:

    发生这种情况的原因是 Razor 中的 @ 运算符会自动进行 HTML 编码。如果你想避免这种编码,你需要使用IHtmlString:

    public static IHtmlString ImageLink(
        this HtmlHelper htmlHelper,
        string imgSrc, 
        string alt, 
        string actionName,
        string controllerName, 
        object routeValues, 
        object htmlAttributes, 
        object imgHtmlAttributes
    )
    {
        return MvcHtmlString.Create(@"<img src=""../../Content/images/english.png"" />");
    }
    

    如果这样写,显然会更正确(并且在所有情况下都可以使用,无论从何处以及如何调用此助手):

    public static IHtmlString ImageLink(
        this HtmlHelper htmlHelper,
        string imgSrc,
        string alt,
        string actionName,
        string controllerName,
        object routeValues,
        object htmlAttributes,
        object imgHtmlAttributes
    )
    {
        var img = new TagBuilder("img");
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        img.Attributes["src"] = urlHelper.Content("~/Content/images/english.png");
        // Don't forget that the alt attribute is required if you want to have valid HTML
        img.Attributes["alt"] = "English flag"; 
        return MvcHtmlString.Create(img.ToString(TagRenderMode.SelfClosing));
    }
    

    然后

    @Html.ImageLink("../../Content/images/english.png","English", "ChangeCulture", "Account", new { lang = "en", returnUrl = this.Request.RawUrl }, null,null)
    

    会正常工作。

    如果您无法修改帮助程序,您可以使用@Html.Raw

    @Html.Raw(Html.ImageLink("../../Content/images/english.png","English", "ChangeCulture", "Account", new { lang = "en", returnUrl = this.Request.RawUrl }, null,null))
    

    【讨论】:

      【解决方案2】:

      让它返回MvcHtmlString(下面是我的示例)。

       public static MvcHtmlString IconImg(this HtmlHelper htmlHelper, string icon, string title = "", string size = "16x16") {
              string path = VirtualPathUtility.ToAbsolute("~/res/img/icons/" + size + "/" + icon + ".png");
              string imgHtml = "<img src='" + path + "' title='" + title + "' style='border:none' />";
              return new MvcHtmlString(imgHtml);
          }
      

      【讨论】:

        猜你喜欢
        • 2020-09-15
        • 2016-10-17
        • 2019-05-10
        • 1970-01-01
        • 2019-11-04
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 2023-02-21
        相关资源
        最近更新 更多