繁体   English   中英

使用TagBuilder和ASP.NET MVC 4(使用Razor引擎)渲染html代码

[英]Rendering html code using TagBuilder and ASP.NET MVC 4 (with Razor engine)

我想使用TagBuilder渲染li项目。

我的功能

public static string RenderListTag(this HtmlHelper helper, string labelText, string action, string controller, bool isAdmin, string listCssClass = "")
        {
            string value = string.Empty;

            TagBuilder li = new TagBuilder("li");
            TagBuilder anchor = new TagBuilder("a");
            UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

            if (string.IsNullOrEmpty(action) || string.IsNullOrEmpty(controller))
            {
                anchor.MergeAttribute("href", "#");
            }
            else
            {
                anchor.MergeAttribute("href", urlHelper.Action(action, controller, new
                {
                    area = isAdmin ? "Admin" : ""
                }));
            }

            anchor.SetInnerText(labelText);

            if (action.IsEqualWith(helper.ViewContext.RouteData.Values["action"].ToString()))
            {
                li.MergeAttribute("class", "active");
            }

            if (!string.IsNullOrEmpty(listCssClass))
            {
                li.MergeAttribute("class", listCssClass);
            }

            li.SetInnerText(anchor.ToString(TagRenderMode.Normal));

            return li.ToString(TagRenderMode.Normal);
        }

当我使用以下代码调用时:

@Html.RenderListTag("Home", "Index", "Contents", false)
@Html.RenderListTag("About", "About", "Home", false)
@Html.RenderListTag("Contact", "Contact", "Home", false)
@Html.RenderListTag("Show toolbar", "", "", false, "options no-display")
@Html.RenderListTag("CMS", "Index", "Home", true)

结果打印为text NOT html标签。

<li class="active">&lt;a href=&quot;/Contents&quot;&gt;Home&lt;/a&gt;</li> <li>&lt;a href=&quot;/Home/About&quot;&gt;About&lt;/a&gt;</li> <li>&lt;a href=&quot;/Home/Contact&quot;&gt;Contact&lt;/a&gt;</li> <li class="options no-display">&lt;a href=&quot;#&quot;&gt;Show toolbar&lt;/a&gt;</li> <li class="active">&lt;a href=&quot;/Admin/Home&quot;&gt;CMS&lt;/a&gt;</li> 

我想打印HTML标签而不是文本。

我的错误在哪里?

我发现了我的错误:)

我用了

li.SetInnerText(anchor.ToString(TagRenderMode.Normal));

正确的方法是

li.InnerHtml = anchor.ToString(TagRenderMode.Normal);

我将我的函数类型从string更改为MvcHtmlString如:

public static MvcHtmlString RenderListTag(this HtmlHelper helper, string labelText, string action, string controller, bool isAdmin, string listCssClass = "")

而功能的回归是:

return MvcHtmlString.Create(li.ToString());

现在,工作。

您必须从方法返回MvcHtmlString

public static MvcHtmlString RenderListTag(this HtmlHelper helper, string labelText, string action, string controller, bool isAdmin, string listCssClass = "")
{
    string value = string.Empty;

    TagBuilder li = new TagBuilder("li");
    TagBuilder anchor = new TagBuilder("a");
    UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

    if (string.IsNullOrEmpty(action) || string.IsNullOrEmpty(controller))
    {
        anchor.MergeAttribute("href", "#");
    }
    else
    {
        anchor.MergeAttribute("href", urlHelper.Action(action, controller, new
        {
            area = isAdmin ? "Admin" : ""
        }));
    }

    anchor.SetInnerText(labelText);

    if (action.IsEqualWith(helper.ViewContext.RouteData.Values["action"].ToString()))
    {
        li.MergeAttribute("class", "active");
    }

    if (!string.IsNullOrEmpty(listCssClass))
    {
        li.MergeAttribute("class", listCssClass);
    }

    li.SetInnerText(anchor.ToString(TagRenderMode.Normal));

    return new MvcHtmlString(li.ToString(TagRenderMode.Normal));
}

使用@Html.Raw(Html.RenderListTag("CMS", "Index", "Home", true))

尝试将最后一行更改为:

return helper.Raw(li.ToString(TagRenderMode.Normal)).ToHtmlString();

对于这样的情况,我在HttpUtility类的静态方法HtmlDecode中有一个好朋友。 尝试:返回MvcHtmlString.Create(HttpUtility.HtmlDecode(li.ToString(TagRenderMode.Normal)));

HTH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM