sen

导航

[Asp.net] 一个基于B/S会员管理系统的知识总结

Posted on 2010-06-01 12:06  sen  阅读(806)  评论(0编辑  收藏  举报

总结:

1,无论乍么样的服务器控件它的展现都会转成html ,所有的动作都通过回发实现,(如果控制的autopostback为True的话,那么还将产生JS function __doPostBack(eventTarget, eventArgument) { })

2,所有的服务器ID都将转成客户端的ID (这里要注意用了Master页和没用Master页面的产生的ID的不同)

3,所有的theme皮肤都将转成CSS 样式

4.所有的验证都将会转变是HTML + JS (当有设置验证组的时候 ,将产生一个JS的验证数组 统一验证)

5,不过有如下几点需要注意的:

a.所有的控件如果设置了Visible="False"的话,那么这个控制将不被产生html 客户端控件 ,也即在客户端是没有的! 查看源码里面没有,JS也取不到。

b.所有的控件如果设置了Enabled="false",那么在产生的html是不能更新的,就算是用JS改变了它的值 在后台也不会变! 还是后台最后设定的值(所以在要求用户不能改,却要用JS来控制的控件来说,不能用Enabled="false" 要在适当当的地方加:

this.tb_EmployeesName.Attributes.Add("ReadOnly", "ReadOnly");加一个ReadOnly属性(这个要比下面的JS好! 因为下面的JS当页面回发的时候会闪一下显示)

)

也可以在JS中这样做:

window.onload = function () 
{
    var queryString = document.getElementById("<%= tb_QueryString.ClientID %>");
    queryString.style.visibility = "hidden";
}

c.在有master的页面中 产生的客户端ID号不是原来的ID号! 当然如果页面不变的话,可以通过产生后查看源码来看它的ID ,但另一种做法就是通过调用后台的代码来做,如下:document.getElementById("<%= tb_QueryString.ClientID %>");

d.在JS中用showModalDialog打开一个模态窗体得到返回值时可以用这种方法:

  function SearchMember() {
    var returnValue = showModalDialog('../SearchFolder/SearchMemberSignalReturn.aspx', 'subpage', 'dialogWidth:800px;dialogHeight:675px;center:yes;help:no;resizable:no;status:no'); //打开模态子窗体,并获取返回值
    var recommendMemberName = document.getElementById("<%=tb_RecommendMemberName.ClientID %>");
    var recommendMember = document.getElementById("<%=tb_RecommendMember.ClientID %>");
    try {
        recommendMemberName.value = returnValue.split('&')[1];
        recommendMember.value = returnValue.split('&')[0];
        }
    catch (e) {
        alert("未选择任何会员!");
        }
    }

在打开的窗体中用这样的JS来返回:

function getCheck(gv) { 
        var GridViewableSearchList = document.getElementById(gv);//GridView
        var objs = GridViewableSearchList.getElementsByTagName("input");
        var memberId="";
        var memerName="";
        for (var i = 0; i < objs.length; i++) {
            if (objs[i].type.toLowerCase() == "checkbox") {
                if (objs[i].checked) {
                    var aa = objs[i].parentNode.parentNode;
                    memberId += aa.cells[1].innerText + ","
                    memerName += aa.cells[2].innerText + ","
                }
            }
        }
         window.returnValue = memberId + "&" + memerName;
         window.close();
  }

这里要注意的是模态窗体 是具有缓存的,就是可能两次打的结果是一样的! 为了避免这个要在模态窗体head区加下面句话

另外如果在模态窗体有服务器控件的话,那么要加一句回发指向自己的代码 如下所示:

<head runat="server">
//处理当页面回发的时候不打开一个新页面
 <base target="_self"/> 
//处理让页面没缓存
 <meta http-equiv="pragma" content="no-cache">
 <title></title>
</head>

e.所有的页面都没有在服务器上保存的,每次回发有数据是因为MS用了一个隐藏域:

<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />

6,一个配置文件的一些说明:

 

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
    <configSections>
    </configSections>
  <connectionStrings>
    <add name="MemberManagement.Properties.Settings.connectionString"
        connectionString="Data Source=.;Initial Catalog=MemberManagement;User ID=sa"
        providerName="System.Data.SqlClient" />
  </connectionStrings>
    <!--<location path="image\">
        <system.web>
            <authorization>
                <allow users ="*"/>
            </authorization>
        </system.web>
    </location>-->
    <system.web>
        <compilation debug="true" targetFramework="4.0">
            <assemblies>
                <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
                <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <!--如果放到Windows2003下面,那么要把下面这句删除 才不会报错! 具体原因不清楚!-->
                <add assembly="VsWebSite.Interop, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies></compilation>
     
     
    <pages theme="Normal">
      
    </pages><!--上面这一句指定一个全局的皮肤 这样设定后,所有的服务器控件如样式属性如果所在页面里没有设置的都用运用这个默认的-->
        <authentication mode="Forms">
        <!--用来指定验证方式的, 如果验证不成功转向loginUrl所设置的页面,成功转向默认的页面-->
            <forms loginUrl="EmployeeLogin.aspx" defaultUrl="Default.aspx" name="UserAuthentication"/>
        </authentication>
        <authorization>
        <!--当用户没有登陆时,拒绝访问所有的页面 -->
            <deny users="?"/>
        </authorization>
        <membership defaultProvider="CustomMembershipProvider">
        <!--设置验证的provider,这个Provider 要继承System.Web.Security.MembershipProvider -->
            <providers>
                <add name="CustomMembershipProvider" type="MemberManagement.CustomMembershipProvider" requiresQuestionAndAnswer="false" connectionString="DatabaseConnectionString"/>
            </providers>
        </membership>
        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.aspx">
                <!--指定发生错误时的页面-->
            <error statusCode="403" redirect="~\EmployeeDeny.aspx"/>
            <error statusCode="404" redirect="FileNotFound.aspx"/>
        </customErrors>
         <!--这个用来指定字符集 ,在数据库 使用系统 开发系统的语言不一样时,有时要设置这个才能让页面不出现乱码-->
        <globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="utf-8" responseHeaderEncoding="gb2312"/>
         
    </system.web>
    <!--下面这个节点是为了在拒绝所有用户访问页面的同样,开放下面目录,让未登陆的用户也可以访问 -->
    <location path="images">
        <system.web>
            <authorization>
                <allow users="*"/>
            </authorization>
        </system.web>
    </location>
</configuration>

7,一个在自定义的System.Web.Security.MembershipProvider下用session的实例

 public override bool ValidateUser(string username, string password)
        {
            try
            {
                password = WebSecurity.EncodePassword(password);
                DBProvider db = new DBProvider();
                string[] parameter = { "@username", "@password" };
                object[] parameterValue = { username, password };
                DataTable dt = db.GetDataTable("SELECT  EmployeeName , EmployeeFullName  ,EmployeeEmail,EmployeePhone ,EmployeePartMent,EmployeeRight  FROM Employee WHERE   EmployeeIsValid=1  and EmployeeName=@username AND EmployeePassword=@password", parameter, parameterValue);
                if (dt.Rows.Count > 0)
                {
                    //要用下面的这种方法
                    System.Web.SessionState.HttpSessionState session = System.Web.HttpContext.Current.Session;
                    EmployeeClass employee = new EmployeeClass();
                    employee.EmployeeName = dt.Rows[0]["EmployeeName"].ToString();
                    employee.GenEmployeeRight(dt.Rows[0]["EmployeeRight"].ToString());
                    session["employee"] = employee;

                    return true;
                }
                else
                {
                    return false; 
                }
            }
            catch  
            {

                return false;
            }
        }
           

8,关于连动下拉菜单不刷新的

就是把有几个上一级菜单都放在updatepanel里面去,然后设置autopostback 就可以了

<div>
    <asp:ScriptManager ID="ScriptManager1" runat="server">
                </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:DropDownList ID="DropDownList1" runat="server" 
                    onselectedindexchanged="DropDownList1_SelectedIndexChanged" 
                    AutoPostBack="True">
                    <asp:ListItem>A</asp:ListItem>
                    <asp:ListItem>B</asp:ListItem>
                    <asp:ListItem>C</asp:ListItem>
                </asp:DropDownList>
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>