首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MVC Html扩展返回字符串而不是html标记?

MVC Html扩展返回字符串而不是html标记?
EN

Stack Overflow用户
提问于 2011-05-05 03:31:37
回答 2查看 16.4K关注 0票数 17

如果我有一个这样的扩展:

 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)

我的输出如下所示:

知道为什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-05 03:34:39

发生这种情况的原因是因为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))
票数 37
EN

Stack Overflow用户

发布于 2011-05-05 03:34:00

让它返回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);
    }
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5888864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档