3月 17

一般我们做网站是都有一个后台管理程序,比如说放在admin文件夹里,如果直接访问一般都是跳转到登陆页,如果你以前都是用cookies的话,那每张后台页面都要写代码,而且还不能方便的做到,登陆成功后不能自动根据当前所请求的页而跳转回去,在asp.net要实现这个功能就很简单了,

首先,在你的后台管理文件夹里新建一个web.config,代码如下:

<configuration>
    <system.web>
        <authorization>
              <!–?是不允许匿名访问–>
           <deny users="?" />
        </authorization>
    </system.web>
</configuration>

其次在你的asp.net项目根目录里的Web.config修改authentication部分,代码如下:

<authentication mode="Forms">
           <forms name="login" loginUrl="admin/login.aspx" protection="All"></forms>
</authentication>

注意:

login是cookies的名字,最好取一个特别不一样的,如公司的名称
protection="All"是把cookies加密
loginUrl 是没有验证时,将自动跳转到admin/login.aspx页面

OK,准备工作都做好了,接下来,实践一下吧,

登陆前台界面,不写代码了,直接看图还清楚一点

登陆按钮代码:

if(如果用户密码正确)
{              
System.Web.Security.FormsAuthentication.RedirectFromLoginPage("login",true);
}

这样就会自动跳转到用户所请求的网页了.这样登陆就做好了,但登陆一次以后访问就直接进入了,所以我们再加个注销按钮就OK了.

注销按钮代码:

System.Web.Security.FormsAuthentication.SignOut();
Response.Redirect("login.aspx");

以前做网站是都是每张页面都要写代码,这样是不是就轻松多了呢?

written by ocean

3月 10

create proc ZZ_Relation
(

@pagesize     int = 10,         —-每页显示的记录个数
@pageindex         int = 1         —-要显示那一页的记录

)
AS

create table #Tmp –创建临时表#Tmp
(
    ID    int IDENTITY (1,1)      not null, –创建列ID,并且每次新增一条记录就会加1
    SPDM                 varchar(200),  
SPMC     varchar(200),
CA_NAME    varchar(200),
GG1DM varchar(200),
GG2DM varchar(200),
BZSJ     varchar(200)
    primary key (ID)       –定义ID为临时表#Tmp的主键      
)

insert into #Tmp
select SHANGPIN.SPDM,SHANGPIN.SPMC,COMMODITY_AUTO.CA_NAME ,GG1DM,GG2DM,BZSJ from
SHANGPIN LEFT JOIN COMMODITY_AUTO ON SHANGPIN.SPDM=COMMODITY_AUTO.CA_CODE left join ProductUpDown on ProductUpDown.SPDM=COMMODITY_AUTO.CA_CODE
where ProductUpDown.ISUP=1

DECLARE @sql VARCHAR(1000)

if(@pageindex=1)
begin
set @sql='select top '+ CAST(@pagesize as varchar(10)) + '* from #Tmp'
end
else
begin
set @sql='select top '+CAST(@pagesize as varchar(10))+' * from #Tmp where id not in( select top '+ CAST(@pagesize*(@pageindex-1) as varchar(10)) +' id from #Tmp )'
end

exec(@sql)

drop table #Tmp    –删除临时表#Tmp

今天写这个存储过程费劲死了,好歹终于完成了,有一种让人虚脱掉的感觉

written by ocean

3月 06

页面调用(struts):

<div class="font-zi-t">
             身份证号码

<html:text property="idCard" maxlength="18"
              styleId="idCard" onchange="checkId(this.value)" />
             <span id="idCardError" class="STYLE6">不可更改,请慎重填写&nbsp;(严格保密)</span>
       </div>

javascript验证身份证方法:

function checkId(str)
{
var idCardError=document.getElementById("idCardError");
if(str==""){
  idCardError.innerHTML="不可更改,请慎重填写&nbsp;(严格保密)";
  return true;
}
if(str.length!=18&&str.length!=15)
   {
    idCardError.innerHTML="身份证号码应为15位或18位";
    return false;
   }
if(str.length==18)
{
 var arra=new Array(17);
 var arrw=new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
 var arrchk=new Array('1','0','x','9','8','7','6','5','4','3','2');
 var arrbase=new Array(0,1,2,3,4,5,6,7,8,9,10)
 var i,sum,resu,num;
 num=0;
 resu=0;
 sum=0;
 for(i=0;i<arra.length;i++)
 {
    arra[i]=parseInt(str.charAt(i));
    sum=arra[i]*arrw[i];
    resu+=sum;
 }
// alert(resu);
 num=parseInt(resu%11);
  //alert(num);
  //alert(arrchk[num]);
  //alert(str.charAt(17));
  //alert(str.charAt(17).toLowerCase());

 if(arrchk[num]!=str.charAt(17).toLowerCase())
 {
  idCardError.innerHTML="身份证不合法";
     return false;
   }
   else
   {
   idCardError.innerHTML="不可更改,请慎重填写&nbsp;(严格保密)";
   return true;
   }
}

if(str.length==15)
   {
   var flag=null;
             if(isNaN(str))
    {
    idCardError.innerHTML="只能为数字";
    return flag;
    }
    if(parseInt(str.substr(8,2))>12)
    {
    idCardError.innerHTML="出生月不合法";
    return flag;
    }
    if(parseInt(str.substr(10,2))>31&&parseInt(str.substr(8,2))!=2)
    {
    idCardError.innerHTML="出生日不合法";
    return flag;
    }
    var date=new Date();
    y=parseInt(date.getFullYear());
    x=parseInt("19"+str.substr(6,2));
    if(Math.abs(y-x)>100||Math.abs(y-x)<18)
    {
    idCardError.innerHTML="出生日不合法"+x;
 
    return flag;
    }
   var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
    if(aCity[parseInt(str.substr(0,2))]==null)
    {
    idCardError.innerHTML="省份不合法";
    return flag;
    }
    var year=parseInt(str.substr(6,2));
    year=parseInt("19"+year)
   if(year%400==0 || (year%4==0 && year%100!=0))
            {
      if(parseInt(str.substr(10,2))>29&&parseInt(str.substr(8,2))==2)
        {
        idCardError.innerHTML="出生年月日不合法";
         return flag;
               }    
        else if(parseInt(str.substr(10,2))>28&&parseInt(str.substr(8,2))==2)
        {
        idCardError.innerHTML="出生年月日不合法";
         return flag;
      }
   }
if(!flag)
{
idCardError.innerHTML="不可更改,请慎重填写&nbsp;(严格保密)";
return true;
}
    }

}

特点:验证非常严格

written by ocean

3月 05

/// <summary>
    /// 将Html转换成文本,使用正则表达式
    /// </summary>
    /// <param name="html"></param>
    /// <returns></returns>
    /// 来自jadepark的Blog,感谢jadepark!
    /// http://www.cnblogs.com/jadepark/archive/2007/08/04/838907.html
    /// Written:      [CHINA] Zhang Liu
    /// Date:         1,Jun,2006
    /// Version:      1.0
    /// Support:      MYBASK  http://www.mybask.net
    /// Looking for latest version or similar implementation of this function, please visit: http://www.mybask.net
    public static string ConvertHTML2TextRegex(string html)
    {

        string[] aryRegex ={@"<%=[\w\W]*?%>",     @"<script[\w\W]*?</script>",      @"<style[\w\W]*?</style>",    @"<[/]?[\w\W]*?>",    @"([\r\n])[\s]+",
                              @"&(nbsp|#160);",     @"&(iexcl|#161);",                @"&(cent|#162);",             @"&(pound|#163);",    @"&(copy|#169);",
                              @"&#(\d+);",          @"–>",                           @"<!–.*\n"};

        string[] aryReplacment = { "", "", "", "", "", " ", "", "", "", "", "", "", "" };
        string strStripped = html;
     
            for (int i = 0; i < aryRegex.Length; i++)
            {
                Regex regex = new Regex(aryRegex[i], RegexOptions.IgnoreCase);
                strStripped = regex.Replace(strStripped, aryReplacment[i]);
            }
   

        strStripped.Replace("\r\n", "");
        strStripped.Replace("\t", "");
       
        return strStripped;

    }

written by ocean

3月 04

      目的:这篇文章将描述在asp.net中如何管理cache以及cache各个参数的用法.

     介绍:

          在我解释cache管理机制时,首先让我阐明下一个观念:IE下面的数据管理。每个人都会用不同的方法去解决如何在IE在管理数据。有的会提到用状态管理,有的提到的cache管理,这里我比较喜欢cache管理,因为本人比较喜&S220;cache&S221;这个词。但是状态管理和cache管理这两个在概念和意义上是不同的,下面就让我们来讨论下两都在各个方面的不同之处。

         虽然cache管理并不存在于Windows程序,但在web环境中已经得到巨大的应用。自从HTTP变成无协议以来,在WEB上要想分辨两个不同请求变得非常难,如何分辨如此多的请求变得非常重要,如果是同一请求,我们就可以把数据缓存起来供web上所有用户访问,减少数据重复进行物理加载。

         asp.net提供了几种方法来缓存数据在客户端和服务器端,但是我们经常为到底用哪种方式而感动苦恼。asp.net提供了以下三种实现方式:

        1:Session;2: Application 3: Cache objects,我们必须非常清楚它们之间的优势,这样才能充分利用它们的优势发挥在web程序中.

     背景:

          这篇文章中,我将简单涉及cache管理中的不同功能,在web程序中,我们为了避免因高并发产生的数据访问带来的性能问题,我们有必要把数据缓存于服务器端,使得后来的访问可以直接调用缓存数据,起到数据重用的作用。

       

         缓存能够帮忙我们提到服务质量的三个重要方面:

           性能:缓存数据达到数据重用.避免了重复的物理数据加载.
           可量测性:数据缓存后,减少了从服务器端加载数据。
           实用性:如果其它的系统或者是数据库发生死机,那么仍然可以从缓存中取得数据不受局部硬件的影响。

     在一个web 程序中,我们可以数据缓存,页面缓存等等,让我们来看下数据缓存在服务器端和客户端的不同之处。

     1.服务器端缓存:

         1.1Session状态管理:

          session为每个人缓存数据.也就是说这样缓存的数据并不能同时供多人共享,限于为单个人缓存数据。
          状态管理有三种实现方式,分别是:
           1.11:InProc:
                 它的数据存储在aspnet_wp.exe 进程中,数据会因为IIS的重启而丢失。
           1.12:StateServer :
                 较InProc不同的是,它可以存储于不同的服务器中.
           1.133:SQLServer:

                它的数据存储在数据库中,数据不会因为IIS的重启而丢失数据。

           后两种方法与InProc最大的区别在于,我们要确保缓存的数据是可序列化的,否则只能用于第一种方式.为此我们要仔细分析从而选出最适合自己的方式.

          下面是如何作用Session的代码片段:


string empNum = Request.QueryString["empnum"];
if (empNum != null)
{
   string details = null;

   if (Session["EMP_DETAILS"] == null)
   {
       //Get Employee Details for employee number passed
       string details = GetEmployeeDetails(Convert.ToInt32(empNum));

        Session["EMP_DETAILS"] = details;
    }
   else
   {
        details = Session["EMP_DETAILS"];
    }

   //send it to the browser
    Response.Write(details);
}

       1.2 ASP.NET application
              asp.net为我们提供了另外一种全局变量保存方法,Application对象,它也是面向所有用户,它的生命周期和应用程序一样,当应用程序初始化后它就开始重建。但它最大的缺点是没有相关数据过期的方法,此时就要用到cache管理。

      1.3 ASP.NET cache
               cache是我最喜欢用的机制,这也是为什么我喜欢说它的原因。它提供了键-值对应的方法,cache对应的命名空间是:System.Web.Caching 它的生命周期也依赖于应用程序,但它并不像session,这也是面向所有用户的。虽然cache看起来特别像application,但它最大的不同是提供了数据缓存失效控制方法以及数据缓存依赖管理。也就是说,在cache中我们可以非常容易的按照事先设定好的过期时间来让cache过期,删除cache,我们也可以根据缓存依赖关系来操作cache,当依赖的关系有改动时,此时cache也会自动失效。而这都是applicaion没法办到的。

     现在让我们看下asp.net中是如何支持cache的过期以及数据缓存依赖的。

           1.31:缓存依赖:

                顾名思义它是指当事先设定的依赖关系发生变化时,cache 将会失效。在asp.net中提供了两种依赖关系:
                     1.311:文件缓存依赖:当磁盘上的一个文件发生变化时自动让cache失效
                       下面是实例代码:
object errorData;
//Load errorData from errors.xml
CacheDependency fileDependency =
     new CacheDependency(Server.MapPath("errors.xml"));

Cache.Insert("ERROR_INFO", errorData, fileDependency);

                      1.312:键值缓存依赖看起来和文件缓存非常像,不同之外就是这种依赖方式不同而已,当有多个cache信息之间互相关联时,一个cache信息的变化将会引起其它cache的失效。例如一个用户信息包含:编号,姓名,地址等,如果用户编号发生变化则cache失效,这种情况下,用户的基本信息就依赖于用户编号。
                       下面是示例代码:
string[] relatedKeys = new string[1];
relatedKeys[0] = "EMP_NUM";
CacheDependency keyDependency = new CacheDependency(null, relatedKeys);
Cache["EMP_NUM"] = 5435;
Cache.Insert("EMP_NAME", "Shubhabrata", keyDependency);
Cache.Insert("EMP_ADDR", "Bhubaneswar", keyDependency);

Cache.Insert("EMP_SAL", "5555USD", keyDependency);

          1.32:过期策略:从创建cache开始,一段时间后自动过期。
                           示例代码:
//Absolute Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
             DateTime.Now.AddDays(1), Cache.NoSlidingExpiration);

//Sliding Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
             Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(60));

       1.4 ASP.NET 页面输出缓存

          有的时候在web站点中,有些页面在很长一段时间内都不会发生变化,例如一个招聘网站,它对于工资的描述文字一般不会经常更改,一般都是一个月更改一次,所以在这一个月内,用户看到的内容都是一样的,所有如果把数据缓存在服务器端并不是完美的解决方案。这里可以用页面输出缓存。

         下面是示例代码:
<%&O4;OutputCache Duration="60" VaryByParam="empNum"
                                       Location="Server"%>

    2:客户端缓存:

          在上面的文章中,我讨论了些数据缓存在服务器端的方法,然而有的时候我们为了提高性能我们要把有些数据缓存到客户端。利用这种机制来达到缓解服务器压力,不过在客户端缓存数据会有各种不同的安全性问题,下面我说简要的说下相关内容:

       2.1 Cookies:cookies在WEB程序开发中应用的非常广泛,它可以非常方便的在客户端与服务器端相互访问,不过它有数据大小限制,最大为4K,所有用它经常是保存小数据。同时cookie对于失效的控制也支持的相当完美。

                    下面是示例代码:

if (this.Request.Cookies["MY_NAME"] == null)
{
    this.Response.Cookies.Add(new HttpCookie("MY_NAME",
                                       "Shubhabrata Mohanty"));
}
else
{
    this.Response.Write(this.Request.Cookies["MY_NAME"].Value);
}

        2.2 ViewState:ViewState是一个全新的概念,它一般用于页面或者是控件中保留数据以供和服务端交通。在ASP中的,我们存储数据是用隐藏控件来完成(Hidden fields),ViewState也是这样用的,只不过它比隐藏控件更加安全性,所有的值都是经过hash处理的。如果你查看页面源代码,你都会看到ViewState的存在,一般ViewState不用来保存大的数据。

                        下面是示例代码:
protected void Page_Load(object sender, EventArgs e)
{
    if (this.ViewState["MY_NAME"] == null)
    {
        this.ViewState["MY_NAME"] = "Shubhabrata Mohanty";
    }
   
    //txtName is a TextBox control
    this.txtName.Text = this.ViewState["MY_NAME"].ToString();

}

       2.3 隐藏控件 Hidden fields:它是最简单的,不用多说
                    下面是示例代码:
<!–In ASP.NET–>
<asp:HiddenField ID="myHiddenField" Value="Shubhabrata"
                                             runat="server" />
<!–In HTML–>

<input id="myHiddenField" type="hidden" value="Shubhabrata" />

written by ocean

3月 03

access数据库以方便携带,容易部署而受到一些小型系统的喜欢

最近在做一个blogs,因为空间的限制,只能用Access数据库

测试了一下,当数据量2000+的时候分页比较慢

我的SQL语句是

sql = "select top 10 * from tb_article where id not in (select top " + current * 10 + " id from tb_article order by id desc ) order by id desc";

current 是页码

随后想到一种:

sql = "select * from tb_article where id between "+10*current +" and "+10*(current+1) +" order by id desc";

不过在删除存在的情况下会有问题

第三种想到的方法:      

sql = "select top 10 * from tb_article where id >"+current*10 +" order by id desc";

同样,在删除情况下还是会有问题

最后又想到一个思路,还是用between

同时新建一个数据表,里面有三个字段,(页码,首记录ID,尾记录ID)

每次分页的时候首先查询这个表

应该速度会加快.

目前仅在思想中,未测试

不过此办法比较麻烦,最后使用如下方法

int total = GetListCount(current);

   sql = "select * from tb_article where id between

 ("+total+"-(SELECT MAX(id)    FROM (SELECT TOP " + (current + 1) * 10 + " id  FROM tb_article order by id))+1)

and

("+total+"-(SELECT MAX(id)    FROM (SELECT TOP " + current * 10 + " id  FROM tb_article order by id)))

order by id desc ";

         

written by ocean

3月 02

首先我很遗憾的告诉大家,因为微软的偷懒,目前UpdatePanel还不支持文件上传。变相的解决办法就是UpdatePanel中设置PostBackTrigger:

<asp:updatepanel runat="server"><contenttemplate><asp:fileupload runat="server"><asp:button runat="server" text="上传"></asp:button></asp:fileupload></contenttemplate><triggers><asp:postbacktrigger controlid="Button1"></asp:postbacktrigger></triggers></asp:updatepanel>

而如果你又想在这个UpdatePanel上做点花样,比如加了一个asp:Panel, 可以通过按钮事件触发隐藏或显示的,你会发现FileUpload1并不能找到文件。。。

其实道理很简单,UpdatePanel中的内容是通过XmlHttp实时填充的,在你让他显示之前,查看页面源代码里面是空的。一个动态控件更新普通数据没问题,但上传文件就不行了,我的解决办法是用普通div代替asp:Panel,并写了2个函数来动态发送控制脚本,按钮事件中只要调用该函数即可:

</p> <div></div> <p>private void ShowPanel(){string script = &quot;document.getElementById(&#39;Panel1&#39;).style.display=&#39;&#39;;&quot;;ScriptManager.RegisterStartupScript(this.Page, this.GetType(), &quot;ShowPanel&quot;, script, true);}private void ClosePanel(){string script = &quot;document.getElementById(&#39;Panel1&#39;).style.display=&#39;none&#39;;&quot;;ScriptManager.RegisterStartupScript(this.Page, this.GetType(), &quot;ClosePanel&quot;, script, true);}??附上传代码: &nbsp; &nbsp; &nbsp; string type = FileUpload1.PostedFile.ContentType; &nbsp; &nbsp; &nbsp; &nbsp;string filename = key + &quot;_file1&quot;; &nbsp; &nbsp; &nbsp; &nbsp;string filenameExtension = filePath.Substring(filePath.LastIndexOf(&quot;.&quot;)).ToString().Trim(); &nbsp; &nbsp; &nbsp; &nbsp;string absolutePath = Server.MapPath(&quot;../FileUpload/&quot; + filename + filenameExtension); &nbsp; &nbsp; &nbsp; &nbsp;FileUpload1.PostedFile.SaveAs(absolutePath); &nbsp;?

written by ocean

3月 01

public static string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|cmsData.mdb;Persist Security Info=False";
 

今天做个小网站  使用access数据库,就放在App_Data文件夹下,可以使用这个连接方法

Data Source=|DataDirectory|cmsData.mdb

written by ocean