ASP.NET MVC razor: conditional attribute in HTML
MVC has conditional attributes built in...
<div @{if (myClass != null) { <text>class="@myClass"</text> } }>Content</div>
<div class="@myClass">Content</div>
If @myClass is null, it just won't use the attribute at all...
I know that may not quite solve your current issue, but it is noteworthy!
http://weblogs.asp.net/jgalloway/archive/2012/02/16/asp-net-4-beta-released.aspx
I use a small helper method that will conditionally add an attribute if the value is non-empty, and, if defined, when a Boolean function expression evaluates to true
:
public static MvcHtmlString Attr(this HtmlHelper helper, string name, string value, Func<bool> condition = null)
{
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(value))
{
return MvcHtmlString.Empty;
}
var render = condition != null ? condition() : true;
return render ?
new MvcHtmlString(string.Format("{0}=\"{1}\"", name, HttpUtility.HtmlAttributeEncode(value))) :
MvcHtmlString.Empty;
}
Once defined, I can use this method in my Razor views:
<li @(Html.Attr("class", "new", () => example.isNew))>
...
</li>
The above code will render <li class="new">...</li>
if example.isNew == true
, if not will omit the entire class
attribute.
<li class="@(ViewBag.pagename == "Business details" ? "active" : null)">
You should replace the inline style="..."
with a separate classname and use the same syntax there.
However, it would be cleaner to make a separate HTML helper extension method that takes a page and action name and generates the HTML generically.