Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TagBuilder和ASP.NET MVC 4(带Razor引擎)呈现html代码_C#_Razor_Asp.net Mvc 4 - Fatal编程技术网

C# 使用TagBuilder和ASP.NET MVC 4(带Razor引擎)呈现html代码

C# 使用TagBuilder和ASP.NET MVC 4(带Razor引擎)呈现html代码,c#,razor,asp.net-mvc-4,C#,Razor,Asp.net Mvc 4,我想使用TagBuilder呈现li项 我的职能 public static string RenderListTag(this HtmlHelper helper, string labelText, string action, string controller, bool isAdmin, string listCssClass = "") { string value = string.Empty; TagBuilder

我想使用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)
结果打印为文本而不是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> 
  • a href=“/Contents”Home/a
  • a href=“/Home/About”About/aa href=“/Home/Contact”Contact/a
  • a href=“#”Show toolbar/a
  • a href=“/Admin/Home”CMS/a
  • 我想打印HTML标记而不是文本


    我的错误在哪里?

    使用
    @Html.Raw(Html.RenderListTag(“CMS”,“Index”,“Home”,true))
    尝试将最后一行更改为:

    返回helper.Raw(li.ToString(TagRenderMode.Normal)).ToHtmlString()

    我发现了我的错误:)

    我曾经

    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());
    

    现在,它可以工作了。

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


    HTH

    必须从方法返回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));
    }
    

    MVC中的所有strinsg都是自动进行HTML编码的,所以我们使用Raw(),您的代码可以正常工作,我投了赞成票。但我将遵循上面描述的方法。这不是一个可接受的答案,扩展不需要用Raw包装就可以工作。以文本形式输出标记的扩展没有被正确写入(在本例中)。请参阅op的“我发现了我的错误”,使用返回类型MvcHtmlString代替string也可以解决问题否?好吧,似乎
    SetInnerText
    才是真正的问题!是的,没错。这是我的痛苦:)这是最正确的答案。为什么要不厌其烦地构建一个HTML帮助程序,而只需要使用HTML.Raw来呈现它?…这就是MvcHtmlString的全部要点。我一直使用:
    returnnewHTMLSTRING(li.ToString())(
    HtmlString
    位于
    System.Web
    )中