写Tab时为了保证慢加载下tab输出不乱必须在服务端写,然后就是出现了很多难看的if else,今天花了点时间写了个帮助类,跟ActionLink的使用一样。
示例代码:
<ul> <li>@Html.TabLink("新闻", "s", new { t = "n" }, new { onclick = "return channelSwitch('n');" }, "tab_selected")</li> <li>@Html.TabLink("全部", "s", new { t = "" }, new { onclick = "return channelSwitch(0);" }, "tab_selected")</li> <li>@Html.TabLink("博客", "s", new { t = "b" }, new { onclick = "return channelSwitch('b');" }, "tab_selected")</li> <li>@Html.TabLink("知识库", "s", new { t = "k" }, new { onclick = "return channelSwitch('k');" }, "tab_selected")</li> <li>@Html.TabLink("博问", "s", new { t = "q" }, new { onclick = "return channelSwitch('q');" }, "tab_selected")</li> </ul>
TabLink代码:
#region TabLinks public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName = null, string currentClass = "current") { return TabLink(htmlHelper, linkText, actionName, controllerName, new RouteValueDictionary(), new RouteValueDictionary(), currentClass); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, string currentClass = "current") { return TabLink(htmlHelper, linkText, actionName, null /* controllerName */, new RouteValueDictionary(routeValues), new RouteValueDictionary(), currentClass); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes, string currentClass = "current") { return TabLink(htmlHelper, linkText, actionName, null /* controllerName */, new RouteValueDictionary(routeValues), HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes), currentClass); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues, string currentClass = "current") { return TabLink(htmlHelper, linkText, actionName, null /* controllerName */, routeValues, new RouteValueDictionary(), currentClass); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes, string currentClass = "current") { return TabLink(htmlHelper, linkText, actionName, null /* controllerName */, routeValues, htmlAttributes, currentClass); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes, string currentClass = "current") { return TabLink(htmlHelper, linkText, actionName, controllerName, new RouteValueDictionary(routeValues), HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes), currentClass); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes, string currentClass = "current") { if (String.IsNullOrEmpty(linkText)) { throw new ArgumentException("Value cannot be null or empty.", "linkText"); } if (IsCurrent(htmlHelper, actionName, controllerName, routeValues)) { htmlAttributes = htmlAttributes ?? new Dictionary<string, object>(); string classValue = currentClass; if (htmlAttributes.ContainsKey("class")) { classValue = htmlAttributes["class"] + classValue; } htmlAttributes["class"] = classValue; } return MvcHtmlString.Create(HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, linkText, null /* routeName */, actionName, controllerName, routeValues, htmlAttributes)); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, object routeValues, object htmlAttributes, string currentClass = "current") { return TabLink(htmlHelper, linkText, actionName, controllerName, protocol, hostName, fragment, new RouteValueDictionary(routeValues), HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes), currentClass); } public static MvcHtmlString TabLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes, string currentClass = "current") { if (String.IsNullOrEmpty(linkText)) { throw new ArgumentException("Value cannot be null or empty.", "linkText"); } if (IsCurrent(htmlHelper, actionName, controllerName, routeValues)) { htmlAttributes = htmlAttributes ?? new Dictionary<string, object>(); string classValue = currentClass; if (htmlAttributes.ContainsKey("class")) { classValue = htmlAttributes["class"] + classValue; } htmlAttributes["class"] = classValue; } return MvcHtmlString.Create(HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, linkText, null /* routeName */, actionName, controllerName, protocol, hostName, fragment, routeValues, htmlAttributes)); } private static bool IsCurrent(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues) { var isCurrent = htmlHelper.RouteValue("action").ToLower() == actionName.ToLower(); if (!string.IsNullOrEmpty(controllerName)) { isCurrent &= htmlHelper.RouteValue("controller").ToLower() == controllerName.ToLower(); } if (routeValues == null) { return isCurrent; } var rvEnum = routeValues.GetEnumerator(); while (isCurrent && rvEnum.MoveNext()) { isCurrent = rvEnum.Current.Value.ToString().ToLower() == htmlHelper.RouteValue(rvEnum.Current.Key).ToLower(); } return isCurrent; } private static string RouteValue(this HtmlHelper htmlHelper, string key) { var v = htmlHelper.ViewContext.Controller.ValueProvider.GetValue(key); if(v==null) return string.Empty; return v.ConvertTo(typeof (string)) as string; } #endregion