• Asp.net MVC Preview 4 中自定义Jquery的HtmlHelper扩展


    前两天介绍了mvc pv4中AjaxHelper的用法

    的确是比较方便,不过也有其缺点,那就是并不是所有人都用Asp.net Ajax的,所以这样做还是显示出了ms的霸气

    没办法,工程里都用的是JQuery于是先试写了2个小功能

    先说使用方法吧,第一个功能是Ajax载入另个页面

        <div id="as">
        
    </div>
        
    <%=Html.JLoadLink<MvcApplication1.Controllers.HomeController>(c => c.Ajax(), "Ajax载入"new AjaxOptions() {
        UpdateTargetId
    ="as"

    }) %>

     最后生成的是一个连接,一点,就将HomeController.Ajax()载入到as这个div中了

    另一个扩展呢,是一个简单的toggle功能

    就是一个元素,原来显示就让它隐藏,原来隐藏就让他显示,不过还是挺多地方用到的

        <%=Html.JToggle("显示/隐藏","d1")%>
        
        
    <div id="d1" style="background: green">
            天之道 损有余 而补不足
    <br />
            是故虚胜实 不足胜有余
    <br />
        
    </div>

      <%=Html.JToggle("显示/隐藏","#d1")%>
        
        
    <div id="d1" style="background: green">
            天之道 损有余 而补不足
    <br />
            是故虚胜实 不足胜有余
    <br />
        
    </div>

    当然,fade也可以,那样就漂亮了许多了


    好,步入正题 ,代码如下:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Web.Mvc;
    using System.Globalization;
    using System.Collections.Generic;
    using System.Text;
    using System.Web.Routing;

    namespace System.Web.Mvc {
        
    /// <summary>
        
    /// http://chsword.cnblogs.com
        
    /// 重典
        
    /// QQ:77298666
        
    /// </summary>
        static public class AjaxJquery {
            
    /// <summary>
            
    /// 就是一个元素,原来显示就让它隐藏,原来隐藏就让他显示
            
    /// </summary>
            
    /// <param name="a"></param>
            
    /// <param name="linkText"></param>
            
    /// <param name="ToggleID"></param>
            
    /// <returns></returns>
            static public String JToggle(this HtmlHelper a, string linkText, String ToggleID)  {
                
    return a.JToggle( linkText, ToggleID, null);
            }
            
    /// <summary>
            
    /// 就是一个元素,原来显示就让它隐藏,原来隐藏就让他显示
            
    /// </summary>
            
    /// <param name="a"></param>
            
    /// <param name="linkText"></param>
            
    /// <param name="ToggleID"></param>
            
    /// <param name="htmlAttributes"></param>
            
    /// <returns></returns>
            static public String JToggle(this HtmlHelper a, string linkText, String ToggleID, object htmlAttributes) {
                
    string linkFormat = "<a href=\"{0}\" {1} {3}>{2}</a>";
                
    string atts = string.Empty;
                
    string ajaxs = string.Empty;
                
    if (htmlAttributes != null)//由object 序列成key="value" 这样的属性模式
                    atts = AjaxJquery.ConvertObjectToAttributeList(htmlAttributes);
                
                ajaxs 
    = string.Format("onclick=\"$('{0}').toggle();\" ",
                    ToggleID[
    0== '#' ? ToggleID : "#" + ToggleID//Jquery里id不是要#嘛得验一下个人的那啥不同啊
                    );
                
    string result = string.Format(CultureInfo.InvariantCulture, linkFormat, "#", atts, a.Encode(linkText), ajaxs);
                
    return result;
            }
        
    /// <summary>
            
    /// 生成一个可以加载地址的Ajax连接
        
    /// </summary>
        
    /// <typeparam name="T"></typeparam>
        
    /// <param name="a"></param>
        
    /// <param name="action"></param>
        
    /// <param name="linkText"></param>
        
    /// <param name="ajaxoptions"></param>
        
    /// <returns></returns>
            static public string JLoadLink<T>(this HtmlHelper a, System.Linq.Expressions.Expression<Action<T>> action, string linkText, AjaxOptions ajaxoptions) where T : Controller {
                
    return a.JLoadLink<T>(action, linkText, null, ajaxoptions);
            }
            
    /// <summary>
            
    /// 生成一个可以加载地址的Ajax连接
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="a"></param>
            
    /// <param name="action"></param>
            
    /// <param name="linkText"></param>
            
    /// <param name="htmlAttributes"></param>
            
    /// <param name="ajaxoptions"></param>
            
    /// <returns></returns>
            static public string JLoadLink<T>(this HtmlHelper a, System.Linq.Expressions.Expression<Action<T>> action, string linkText, object htmlAttributes, AjaxOptions ajaxoptions) where T : Controller {
                
    string linkFormat = "<a href=\"{0}\" {1} {3}>{2}</a>";
                
    string atts = string.Empty;
                
    string ajaxs = string.Empty;
                
    if (htmlAttributes != null)
                    atts 
    = AjaxJquery.ConvertObjectToAttributeList(htmlAttributes);
                
    string link = LinkBuilder.BuildUrlFromExpression<T>(a.ViewContext, action);
                
    //* */a.BuildUrlFromExpression<T>(action);
                if (ajaxoptions != null) {
                    ajaxs 
    = string.Format("onclick=\"{0}$ActionLink('{1}','{2}');return false;\" ",
                        ajaxoptions.OnBegin,
    //$ActionLink这个方法定义在framework.js里,可以看一下
                        link,
    ajaxoptions.UpdateTargetId
                        );
                }

                
    string result = string.Format(CultureInfo.InvariantCulture, linkFormat, "#", atts, a.Encode(linkText), ajaxs);
                
    return result;
            }
            
    /// <summary>
            
    /// 从MVC工程里搞出来的,原来有程序集保护用不了。
            
    /// </summary>
            
    /// <param name="value"></param>
            
    /// <returns></returns>
            public static string ConvertObjectToAttributeList(object value) {
                StringBuilder sb 
    = new StringBuilder();
                
    if (value != null) {
                    IDictionary
    <stringobject> d = value as IDictionary<stringobject>;
                    
    if (d == null) {
                        d 
    = new RouteValueDictionary(value);
                    }

                    
    string resultFormat = "{0}=\"{1}\" ";
                    
    foreach (string attribute in d.Keys) {
                        
    object thisValue = d[attribute];
                        
    if (d[attribute] is bool) {
                            thisValue 
    = d[attribute].ToString().ToLowerInvariant();
                        }
                        sb.AppendFormat(resultFormat, attribute.Replace(
    "_""").ToLowerInvariant(), thisValue);
                    }
                }
                
    return sb.ToString();
            }
        }
    }


     最后再给个下载,让大家看看效果

    JqueryHelper.rar

    效果就是你想的那个效果,事就是这么个事,就不多说了。

  • 相关阅读:
    ES基础知识
    ES工具使用
    ES环境部署
    C# 新特性
    自动化测试工程师--面试
    python 报错 pip安装三方库不成功:WARNING: You are using pip version 20.2.3; however, version 20.2.4 is available
    jmeter 测试调用https接口
    JDK升级操作
    Jmeter之post上传文件
    弱网测试—Network-Emulator-Toolkit(一)
  • 原文地址:https://www.cnblogs.com/chsword/p/Asp_netMVCPreview4JqueryHelper.html
Copyright © 2020-2023  润新知