Issue with TagBuilder.MergeAttribute for parameter null
- by The Yur
I would like to use Razor's feature not to produce attribute output inside a tag in case when attribute's value is null. So when Razor meets <div class="@var" where @var is null, the output will be mere <div. I've created some Html extension method to write text inside tag. The method takes header text, level (h1..h6), and html attributes as simple object. The code is:
public static MvcHtmlString WriteHeader(this HtmlHelper html, string s, int? hLevel = 1, object htmlAttributes = null)
{
if ((hLevel == null) ||
(hLevel < 1 || hLevel > 4) ||
(s.IsNullOrWhiteSpace()))
return new MvcHtmlString("");
string cssClass = null, cssId = null, cssStyle = null;
if (htmlAttributes != null)
{
var T = htmlAttributes.GetType();
var propInfo = T.GetProperty("class");
var o = propInfo.GetValue(htmlAttributes);
cssClass = o.ToString().IsNullOrWhiteSpace() ? null : o.ToString();
propInfo = T.GetProperty("id");
o = propInfo.GetValue(htmlAttributes);
cssId = o.ToString().IsNullOrWhiteSpace() ? null : o.ToString();
propInfo = T.GetProperty("style");
o = propInfo.GetValue(htmlAttributes);
cssStyle = o.ToString().IsNullOrWhiteSpace() ? null : o.ToString();
}
var hTag = new TagBuilder("h" + hLevel);
hTag.MergeAttribute("id", cssId);
hTag.MergeAttribute("class", cssClass);
hTag.MergeAttribute("style", cssStyle);
hTag.InnerHtml = s;
return new MvcHtmlString(hTag.ToString());
}
I found that in spite of null values for "class" and "style" attributes TagBuilder still puts them as empty strings, like <h1 class="" style="" But for id attribute it surprisingly works, so when id's value is null, there is no id attribute in tag.
My question - is such behavior something that should actually happen? How can I achieve absent attributes with null values using TagBuilder?
I tried this in VS2013, MVC 5.