小知识(十一)

 

1 .有时为防止SQL注入需要过滤字符,如对Request.QueryString[]查询字符串的过滤:

 /// <summary>
        /// 过滤字符
        /// </summary>
        /// <param name="Input"></param>
        /// <returns></returns>
        public static string Filter(string sInput)
        {
            if (sInput == null || sInput == "")
                return null;
            string sInput1 = sInput.ToLower();
            string output = sInput;
            string pattern = @"*|and|exec|insert|select|delete|update|count|master|truncate|declare|char(|mid(|chr(|'";
            if (Regex.Match(sInput1, Regex.Escape(pattern), RegexOptions.Compiled | RegexOptions.IgnoreCase).Success)
            {
                throw new Exception("字符串中含有非法字符!");
            }
            else
            {
                output = output.Replace("'", "''");
            }
            return output;
        }

 

2 . 让TextBox里的文字换行

<asp:TextBox ID="txt" TextMode="MultiLine" runat="server" Width="600" Height="100"></asp:TextBox>

把TextBox的TextMode设为MultiLine   用\r\n换行   txt.Text="我是第一行\r\n"+"我是第二行\r\n";

 

3 . 为repeater等控件绑定的数据添加一列,这一列可以是删除,详细等

//dt是已经从数据库中读出来的数据,准备绑定到repeater控件上  
       if (dt != null)
            {
                if (dt.Rows.Count > 0)
                {
                    //添加列
                    dt.Columns.Add("op", typeof(string));
                    //添加操作列
                    for (int k = 0; dt.Rows.Count > k; k++)
                    {
                        dt.Rows[k]["op"] = "<a href=\"tbData_YH_Detail_list.aspx?Id=" + 
dt.Rows[k]["id"] + "\" class='list_link'>详细</a>&nbsp;&nbsp;<a href=\"tbData_YH.aspx?
Type=ShenHe&Id=" + dt.Rows[k]["id"] + "\" class='list_link'>审核</a>&nbsp;&nbsp;<a 
href=\"tbData_YH_update.aspx?Id=" + dt.Rows[k]["id"] + "\" class='list_link'>修改
</a>&nbsp;&nbsp;<a href=\"tbData_YH.aspx?Type=Del&id=" + dt.Rows[k]["id"] + "\" 
class='list_link' alt='删除' onClick=\"{if(confirm('确定要删除吗?')){return true;}return 
false;}\">删除</a>&nbsp;&nbsp;<input type=\"checkbox\" name=\"aid\" value=\"" + dt.Rows[k]
["id"] + "\" />";
                    }
                }
            }
            repeater1.DataSource = dt;  
            repeater1.DataBind(); 

 

        <ItemTemplate>
                <tr class="TR_BG_list"  οnmοuseοver="overColor(this)" οnmοuseοut="outColor(this)">
                    <td align="center" valign="middle" ><%#((DataRowView)Container.DataItem)["ID"]%></td>
                    <td align="center" valign="middle" ><%#((DataRowView)Container.DataItem)["tbDanWei"]%></td>
                    <td align="center" valign="middle" ><%#((DataRowView)Container.DataItem)["tbTime"]%></td>
                    <td align="center" valign="middle" ><%#((DataRowView)Container.DataItem)["sbND"]%></td>
                    <td align="center" valign="middle" ><%#((DataRowView)Container.DataItem)["shenHeFlag"]%></td>
                    <td align="center" valign="middle" ><%#((DataRowView)Container.DataItem)["op"]%></td>
                </tr>
           </ItemTemplate>

 

4 .<%%>与runat="server"控制元素的显示与否

 

<form id="form1" runat="server">
    <%if (visible){%>
    <div>
     <table>
    <tr><td>1111</td></tr>
    </table>
    </div>
    <%}%>
    <hr />
    <div runat="server" id="div2">
    <table>
    <tr><td>2222</td></tr>
    </table>
    </div>
     <asp:Button ID="Button2" runat="server" Text="显示" οnclick="Button2_Click"/>
    <asp:Button ID="Button1" runat="server" Text="隐藏" οnclick="Button1_Click" />
    </form>

 

        protected bool visible = true;
        protected void Button1_Click(object sender, EventArgs e)
        {
            visible = false;
            div2.Visible = false;
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            visible = true;
            div2.Visible = true;
        }

 

5 . SqlserverHelper

http://blog.csdn.net/luxin10/article/details/7003095

 

6.自己封装的ASP.NET MVC地区选择器控件(htmlhelper)

   调用页

 

  @Html.AreaSelector("userArea", "37000000", 3, "AreaSelected")
               <script type="text/javascript">
                   function AreaSelected(data) {
                       $("#area").text(data.code + " " +data.parentName+" "+data.name);  
                   }

                   (function ($) {
                       $('#area-selector').click(function () {
                           userArea.showOrHide();
                       });
                       var left = $("#area-selector").offset().left;
                       var top = $("#area-selector").offset().top;
                       $(".tn-location").css("z-index","99").offset({left:left-20,top:top+25});
                   })(jQuery);
               </script>

 扩展HtmlHelper类

 

     /// <summary>
    /// 扩展HtmlHelper
    /// </summary>
    public static class HtmlHelperAreaSelectorExtensions
    {
        public static MvcHtmlString AreaSelector(this HtmlHelper htmlHelper,string id, string areaCode = null, int depth = 4, string callback = null)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentException("参数名称id不能为空", "id");
            }
            htmlHelper.ViewData["id"] = id;
            htmlHelper.ViewData["areaCode"] = areaCode;
            htmlHelper.ViewData["depth"] = depth;
            htmlHelper.ViewData["callback"] = callback;
            //转到控件页
            return htmlHelper.DisplayForModel("AreaSelector");
        }
    }

 控件页

 

<div class="tn-widget tn-bubble tn-bubble-arrow-top tn-location" style="display: none; position:absolute; width: 300px;">
    <div class="tn-bubble-arrow">
        <b class="tn-arrow-b1 tn-border-gray"></b><b class="tn-arrow-b2 tn-widget-bubble">
        </b>
    </div>
    <div class="tn-bubble-content tn-widget-content tn-border-gray tn-corner-all">
        <div class="tn-text-heading tn-border-gray tn-border-bottom tn-helper-clearfix">
            <div class="tn-helper-right">
                <span class="tn-valign">注册地:<a href="#">山东</a>-<a href="#">青岛</a></span> <a id="area-close" class="tn-icon tn-smallicon-cross tn-icon-inline">
                    删除</a>
            </div>
            <span><a id="area-all" href="#">地区</a></span><span id="area-choose"></span>
        </div>
        <ul class="tnc-location-list tn-helper-clearfix">
            <li><a href="#" id="search-all-area"><strong>所有</strong></a></li>
            <dl></dl>
        </ul>
    </div>
</div>
<script id="areaTemplate" type="text/x-jquery-tmpl">
	<li data-area-code='${areaCode}' data-parent-code='${parentCode}' data-parent-name='${parentName}' data-depth='${depth}' data-name='${name}'><a href='#'>${name}</a></li>
</script>
<script type="text/javascript">
(function ($) {
     var AreaSelector = function (areaCode, depth,callback) {
        this.areaCode = areaCode; //地区编码
        this.depth = depth; //深度
        this.callback = callback; //回调函数
        
        this.init();
    };

    AreaSelector.fn = AreaSelector.prototype = {
        init: function() {
            var self = this; //提前保存当前对象AreaSelector
            //利用冒泡机制为a标签绑定单击事件
            $(".tnc-location-list dl").delegate("a","click",function(){ 
                var areaCode=$(this).closest('li').data('areaCode');
                var depth=$(this).closest('li').data('depth');
                var name=$(this).closest('li').data('name');
                var parentName=$(this).closest('li').data('parentName');
                //如果当前节点深度小于指定的深度就继续读取下一级节点
                if (depth<self.depth) {                 
                    self.getAreas(areaCode); 
                }else{
                    self.selected(areaCode,name,parentName);
                }                   
            });
            //点地区
            $("#area-all").click(function(){
               self.getAreas(self.areaCode);
            });
            //点关闭
            $("#area-close").click(function(){
               $(".tn-location").hide();
            });
            //点所有
            $("#search-all-area").click(function(){
               var code=$("#search-all-area").data("areacode");
               var name=$("#search-all-area").data("areaname");
               self.selected(code,name,"");
            });
            this.getAreas(this.areaCode);
        },

        showOrHide: function() { 
            $(".tn-location").toggle();
        },
       
        getAreas: function(areaCode){
            var param = new Object();
            param.ParentCode = areaCode;
            $.getJSON('@Tunynet.Utilities.WebUtility.ResolveUrl("~/search/GetAreasByParentCode.aspx")',param,function(data){
            //json数据的绑定用的是jquery.tmpl.js
            if(data){
                //设置地区>
                $("#area-choose").text(">"+data[0].parentName);
                //设置"所有"a标签属性
                $("#search-all-area").data("areacode",data[0].parentCode);
                $("#search-all-area").data("areaname",data[0].parentName);
                $('.tn-location dl').empty();
                $("#areaTemplate").tmpl(data).appendTo(".tn-location dl");
            }
            });    
        },
        

        selected: function (code, name,parentName) {
            var data = new Object();
            data.code=code;
            data.name=name;
            data.parentName=parentName;
        
            if (this.callback) {
               this.callback(data);
            }
        }

    };

    @(ViewData["id"]) = new AreaSelector(@(ViewData["areaCode"]),@(ViewData["depth"]), function (data) {    
        @(ViewData["callback"])(data);
    });

})(jQuery);	
    
    
</script>

 

可将(function($){})(jQuery)改成$(function(){}) 尤其在IE6下 会弹出错误提示

 

7.正则 XSS

 

正则 http://deerchao.net/tutorials/regex/regex.htm

XSS http://extjs2.iteye.com/blog/505360

www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

 

8.获取js动态生成的元素的值

使用jquery插件livequery

 

$(".totalRecords").livequery(function () {
            $(this).each(function () {
                totalRecords += parseInt($(this).val());
            });
            $("#globalTotalRecords").text(totalRecords);
        })

 

.totalRecords就是通过js动态创建的元素

要注意livequery会改变原有的js执行顺序,livequery会最后执行,这个具体情况可以设断点看看。

补:

 

$('li').livequery('click', function (e) {
            if ($(e.target).hasClass("className")) {
                return false;
            }
       });

 

 这里的li也是js动态加载过来的元素,当点击li内的元素时,由于冒泡事件,所以也会触发li的冒泡事件,然后判断单击的元素如果有className这个类,就可以进行阻止冒泡事件等操作

这有点像jquery的delegate函数(如上面的地区选择器里用到的delegate),但delegate的**(如上面地区选择器的.tnc-location-list dl)是原来就在页面上,而不是js动态加来的。

可以看出这里的e.target虽然是li的单击事件里,但它仍代表冒泡的源头的那个元素。

 

9.用js屏蔽掉输入框中自动记录功能

 

<input type = password name = Password autocomplete = "off">

http://bbs.51js.com/thread-9125-1-1.html

 

10.上传文件时Form表单的设置

<form  action="upjsp.jsp"  enctype="MULTIPART/FORM-DATA"  method=post>

<input  type="file"  name="filename"  />

另外表单提交方式必须设置为method="post"

实现类ajax上传文件

http://gzcj.iteye.com/blog/322699

http://bbs.csdn.net/topics/310038365

http://www.cnblogs.com/artech/archive/2012/08/15/action-result-03.html

但在asp.net mvc 中通过return javascript(string script)

提示Resource interpreted as Document but transferred with MIME type application/x-javascript

不知为何不行,于是用了

 Response.Write("<script>parent.uploadCallback('upload file success')</script>");

 

<form target="hidden_frame" id="localCollocationImgForm" method="post" enctype="MULTIPART/FORM-DATA" action="@SiteUrls.Instance().UploadLocalColloctionImg(Url.SpaceKey())">
<input name="collocationImg" id="collocationImg" type="file" style='display:none'/>
<input tyoe="submit" id="collocationA">本地上传</a>
<iframe name='hidden_frame' id="hidden_frame" style='display:none'></iframe>
</form>
function uploadCallback(msg) {
        alert(msg);
    }

 

public void UploadLocalColloctionImg(string spaceKey)        

{

  HttpPostedFileBase postFile = Request.Files["collocationImg"];          

  Response.Write("<script>parent.uploadCallback('upload file success')</script>");

}

我在项目里做的上传标签是用js模拟点击的,尼玛,在火狐及谷歌浏览器下是好用的,在尼玛IE浏览器报错:SCRIPT5: 拒绝访问

本来以为以上给出的方法有错,但查了好久发现,原来是IE这坑爹的货,查到的链接如下

http://bbs.csdn.net/topics/390305454?page=1

其实以上楼主只说对了一半,应该这样说,在IE下,上传文件模拟点击了,就不要用js提交,可以点击提交表单的按钮(草,点击两次)

 

11.浏览器端js url编码 服务器端解码

http://www.jb51.net/article/16271.htm

浏览器端js url编码推荐使用 encodeURIComponent()

用encodeURIComponent()貌似服务器端可不用解码

如要解码可用Server.UrlDecode(string)

 

12.js判断滚动条到顶及到底

 

http://zhidao.baidu.com/question/415493553.html?seed=0

$(window).scroll(function () {
            var a = $(document).scrollTop();
            if (a >= $(document).height() - $(window).height()) {
                alert("底");
            }
            if(a==0){
                alert("顶");
            }
        });

 

 

13.jQuery中的事件处理:return false、阻止默认行为、阻止冒泡以及兼容性问题

 

 

return false

在jQuery中,我们常用return false来阻止浏览器的默认行为,那”return false“到底做了什么?

当你每次调用”return false“的时候,它实际上做了3件事情:

event.preventDefault();

event.stopPropagation();

停止回调函数执行并立即返回。

对,你没看错,return false确实做了这么多操作。它之所以被一再无误用,是因为使用它后看起来像是完成了我们的阻止任务,并且语句也很简单。

这3件事中用来阻止浏览器继续执行默认行为的只有preventDefault,除非你想要停止事件冒泡,否则使用return false会为你的代码埋下很大的隐患。

 

preventDefault()

大多数情况下,当你使用return false时,你其实真正需要的是e.preventDefault()。要使用e.preventDefault,你需要确保你传递了event参数到你的回掉函数中。它会替我们完成所有工作,但不会阻止父节点继续处理事件,要记住,你放在代码中的限制越少,你的代码就越灵活,也就越易于维护。

但在使用中你会发现preventDefault有兼容性问题,老版本的IE并不理会这个方法,依然我行我素,此时我们需要一点兼容代码来搞定IE:

window.event.returnValue=  false;//返回值设为false

window.event.keyCode = 0;//如果你想阻止键盘的默认行为,如F5,则这句也是需要的

 

stopPropagation()

有些情况下,你有可能需要停止事件冒泡,直接使用stopPropagation即可。

 

stopImmediatePropagation()

这个方法会停止对象上相关事件的继续执行,即使当前的对象上还绑定了其它处理函数。有时你的代码非常复杂,不同的widgets和plugin就有可能在同一个对象上添加事件,如果遇到这种情况,那你就很有必要理解和使用stopImmediatePropagation。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WordPress知识付费小程序是一种基于WordPress平台的应用程序,它为用户提供了付费获取WordPress相关知识的功能。 首先,WordPress是一款非常流行的开源内容管理系统(CMS),它被广泛应用于网站搭建、博客建设等领域。许多人对如何更好地使用WordPress、如何优化网站、如何添加特定功能等方面有需求,而这些知识的传授可以通过知识付费小程序实现。 知识付费小程序的核心功能是允许WordPress专家将自己的知识以教程、视频或其他形式制作成课程,并设置费用进行销售。用户可以在小程序中浏览各种相关课程,并根据自己的需求选择购买,以提升对WordPress的理解和应用能力。 该小程序还可以提供一种交流平台,让用户能够与其他WordPress用户或专家进行互动。用户可以在论坛、聊天室中就相关问题交流意见,获取解决方案和建议,从而更好地学习和应用WordPress知识。 为了提高用户体验,该小程序可以内置一些功能,如课程进度追踪、学习笔记记录、在线问题解答等。这些功能有助于提供个性化的学习支持,帮助用户更加高效地学习和消化学习内容。 总而言之,WordPress知识付费小程序为WordPress用户提供了学习和交流的机会,让他们能够通过付费获取相关知识,提高自己的技能水平,并与其他用户互动,共同进步。对于WordPress教育和知识传播来说,这是一个创新和有意义的平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值