Loading

MVC标签链接切换帮助类: TabLink

写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

  

posted @ 2012-07-23 18:09  today4king  阅读(938)  评论(0编辑  收藏  举报