C# 使用TagBuilder和ASP.NET MVC 4(带Razor引擎)呈现html代码
我想使用TagBuilder呈现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
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"><a href="/Contents">Home</a></li> <li><a href="/Home/About">About</a></li> <li><a href="/Home/Contact">Contact</a></li> <li class="options no-display"><a href="#">Show toolbar</a></li> <li class="active"><a href="/Admin/Home">CMS</a></li>
a href=“/Contents”Home/a a href=“/Home/About”About/aa href=“/Home/Contact”Contact/aa 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
)中