Welcome to Rolland Town which Record fire's life.
标签类目:ASP.NET
2009年08月22日代码生活

评论关闭

自动改变RadioButtonList选择项目的背景颜色

  最近用1.1的框架写个简单的测试程序。相信使用的人已经不多了,只是记录下,以后可能有用。

  测试由于题目很多,分批显示或者一个题目一个题目显示都不是很完美,所以采用全部显示,测试者选择问题答案之后采用js来控制选择结果。参考了自动改变CheckBoxList选择项目的背景颜色 。我采用DataList嵌套RadioButtonList从数据库读取数据,稍微有些不同。js部分:

<script language="javascript">
    function ChangeSelectedItemColor(RadioButtonListNum,RadioButtonListId, numOfItems)
    {
    		//Get the RadioButtonList object.
        var objCtrl = document.getElementById('DataList1__ctl' + RadioButtonListNum + '_' + RadioButtonListId);
        if(objCtrl == null)
        {
            return;
        }
 
        for(i = 0; i < numOfItems; i++)
        {
            //var name='DataList1__ctl' + checkBoxNum + '_' + checkBoxListId+':'+i;
            var objItem = document.getElementById('DataList1__ctl' + RadioButtonListNum + '_' + RadioButtonListId + '_' + i);
            if(objItem.checked)
            {
                objItem.parentElement.className = 'ItemBgColor';
            }
            else
            {
                objItem.parentElement.className = '';
            }
        }
    }
</script>

代码端:

srbtnlist_stda.Attributes.Add("onclick","ChangeSelectedItemColor('"+ (i+1) +"','srbtnlist_stda','"+srbtnlist_stda.Items.Count+"');");

//srbtnlist_stda是RadioButtonList的id。

2009年07月12日代码生活

评论关闭

.NET1.1Framework说,千万别让我的程序跑2.0下

  自从三年前用.Net1.1的框架写了最后一个ASP.NET的程序后再也没有捣鼓和.NET相关的东西,而是基本都把业余时间投入到了Solaris和Oracle。没想到几天前却发现那个程序被人攻击了。

  仔细看过对方服务器配置之后,发现两个问题:

  1、原来基于1.1的框架写的,结果应用却跑在2.0下,后台登陆的requiredfieldvalidator失效。

  2、web.config中的配置错误,导致“管理员”身份登录验证失效。下面是验证代码:

//1表示用户类型选择的是管理员
private string LoginMessage(string uid, string pwd,string loginType)
               {
                       string erroMessage = "";
                       string configServer = ConfigurationSettings.AppSettings["dbserver"];
                       switch (loginType)
                       {
                               case "0":
                                       erroMessage = "请选择您所属的用户类型!";
                                       break;
                               case "1":
                                       string sqlstr = "server=" + configServer + ";uid=" + uid +
";PWD=" +pwd +";DATABASE=jwc";
                                       SqlConnection myConnection = new SqlConnection(sqlstr);
                                       try
                                       {
                                               myConnection.Open();
                                       }
                                       catch (SqlException exp)
                                       {
          &nbs
p;                                    if (exp.Number == 18456)
                                               {
                                                       erroMessage = "登陆错误,请确认您的用户名和密码,否则请勿尝试登陆!";
                                               }
                                               myConnection.Close();
                                       }
                                       break;
                               case "2":
                                       string countUser = "select count(*) from sectionUser where
sectionUserID =" + uid + "";
                                       string testUser =  "select sectionUserPwd from sectionUser where
sectionUserID ="  + uid + "";
                                       int n = myDb.GetCount(countUser);
                                       if (n>0)
                                       {
                                               string result = myDb.GetDbString(testUser);
                                               if(pwd != result)
                                               {
                                                       erroMessage = "登陆错误,请确认您的用户名和密码,否则请勿尝试登陆!";
             &
nbsp;                                 }
                                       }
                                       else
                                       {
                                               erroMessage = "登陆错误,请确认您的用户名和密码,否则请勿尝试登陆!";
                                       }
                                       break;
                       }
                       return erroMessage;
               }

  第一个问题,很好解决。卸载IIS的所有.NET版本,然后重新安装。最后配置站点的时候将1.1和2.0分别设置两个程序池。站点属性里一定要设置对,1.1的程序别设成2.0。

  第二个问题,当时很迷糊,也没有找到原因。因为程序代码在我本地调试正常,本地和服务器唯一的区别就是我没有安装2.0的框架。最后一句句检查web.config后确认原因,就是web.config中:<add key="dbstring" value="user id=xx; password=xxx; database=xxx; server=xxxx" />server项没有设置对。改之!

  本来还想将程序重新测试一下,但是实在觉得得不偿失,1.1多久远的事情了,改明儿用java重写这个站点的程序吧(算是练习java)。这反映一个问题,微软现在都.NET4.0了,如果向下兼容还做成这样,一定要让用户去确定框架,实在不是多完美的事情。

ASP.NET DataGrid,DataList,Repeater的通用分页类

  长久以来分页是痛苦的,对于初学者,而网上提供的那些分页控件,我也觉得不爽。所以,个人长期以来一直使用PagedDataSource类来写分页代码,也一直没有封装,偶然在网上发现有人也这么做,而且封装了,我就拿过来,做了点改进。现在公开这个类,希望对有需要的朋友有点帮助。

这个类,功能已经全了,而且没有使用存储过程。另外,如果只有一页数据,不会显示下面的上一页之类的分页导航。下面就是代码–

   

<
/tr>

 
  //-----------------------------------------------------------------//
 
  //中文说明--
 
  //文件名:PagedData.cs
 
  //作者:NetFire(Fire.Rolland.Han)
 
  //最后修改日期:2005-4-2
 
  //说明:您可以任意使用,如果有所改进,请告知我Rolland_han @ msn.com
 
  //-----------------------------------------------------------------//
 
  //-----------------------------------------------------------------//
 
  //English--
 
  //filename:PagedData.cs
 
  //Author:NetFire(Fire.Rolland.Han)
 
  //Last Modify:2005-4-2
 
  //Detail:You can use it as your wish,if you ameliorate it,please tell me,Rolland_han @ msn.com
 
  //-----------------------------------------------------------------//
 
  using System;
 
  using System.Collections;
 
  using System.ComponentModel;
 
  using System.Data;
 
  using System.Data.SqlClient;
 
  using System.Web;
 
  using System.Web.SessionState;
 
  using System.Web.UI;
 
  using System.Web.UI.WebControls;
 
  using System.Web.UI.HtmlControls;
 
   
 
  namespace netfiredotname.DotNetPagedData
 
  {
 
        /// <summary>
 
        /// 本类提供DataGrid,DataList,Repeater的通用分页
 
        /// 参考了孟宪会 http://xml.sz.luohuedu.net/xml/ShowDetail.asp?id=D5C6E29D-99F5-44E8-4FED-75AF892A53CB
 
        /// 以及jierry http://www.chinaaspx.com/archive/asp/21934.htm
 
        ///
 
        /// 使用方法:
 
        /// 1.在引用里添加dll的引用
 
        /// 2.using netfiredotname.DotNetPagedData;
 
        /// 3.private DotNetPagedData pager;
 
        /// 4.page_load()
 
        /// if(!IsPostBack)
 
        /// {
 
        /// pager=new DotNetPagedData();
 
        /// pager.PagedPanel=this.pagedPanel;
 
        /// pager.Datagrid=this.DataGrid1; //如果是DataGrid则添加此项
 
        /// pager.Datalist=this.DataList1; //如果是DataList则添加此项
 
        /// pager.Repeater=this.Repeater1; //如果是Repeater则添加此项
 
        /// pager.Lnknext=this.lnkNext;
 
        /// pager.Lnkprev=this.lnkPrev;
 
        /// pager.Lnklast=this.lnklast;
 
        /// pager.Lnkfist=this.lnkfist;
 
        /// pager.Pagenum=this.Pagenum;
 
        /// pager.Pagecount=this.Pagecount;
 
        /// pager.List=this.ddl_jump;
 
        /// //简单示例定义DataSet外部定义,同样也可以采用执行sqlstr,并填充给DataSet,本类也重载了datapage(),详细信息可查看详细代码
 
        /// DataSet ds=new DataSet();
 
        /// ds.ReadXml(Server.MapPath("test.xml"));
 
        /// pager.datapage(ds,5);
 
        /// }
 
        ///
 
        /// // DropDownList必须设定为AutoPostBack,下面添加它的事件
 
        /// 5.private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
 
        /// {
 
        /// pager=new DotNetPagedData();
 
        /// pager.List=this.DropDownList1;
 
        /// pager.Lnkjump=this.HyperLink3;
 
        /// pager.select();
 
        /// }
 
        /// </summary>
 
        
 
        
 
        public class DotNetPagedData: System.Web.UI.Page
 
        {
 
              private System.Web.UI.WebControls.DataGrid datagrid = null;
 
              private System.Web.UI.WebControls.DataList datalist = null;
 
              private System.Web.UI.WebControls.Repeater repeater = null;
 
              private System.Web.UI.WebControls.HyperLink lnknext;
 
              private System.Web.UI.WebControls.HyperLink lnkprev;
 
              private System.Web.UI.WebControls.HyperLink lnkfist;
 
              private System.Web.UI.WebControls.HyperLink lnklast;
 
              private System.Web.UI.WebControls.HyperLink lnkjump;
 
              private System.Web.UI.WebControls.Label pagenum;
 
              private System.Web.UI.WebControls.Label pagecount;
 
              private System.Web.UI.WebControls.Panel pagedPanel;
 
              private System.Web.UI.WebControls.DropDownList list;
 
              
 
              public DotNetPagedData()
 
              {
 
                    //
 
                    // TODO: 在此处添加构造函数逻辑
 
                    //
 
              }
 
              
 
              public System.Web.UI.WebControls.DataGrid Datagrid
 
              {
 
                    get
 
                    {
 
                          return this.datagrid;
 
                    }
 
                    set
 
                    {
 
                          this.datagrid=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.DataList Datalist
 
              {
 
                    get

<
/table>

r>

 
                    {
 
                          return this.datalist;
 
                    }
 
                    set
 
                    {
 
                          this.datalist=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.Repeater Repeater
yle="width: 0px;">
 
              {
 
                    get
 
                    {
 
                          return this.repeater;
 
                    }
 
                    set
 
                    {
 
                          this.repeater=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.HyperLink Lnkprev
 
              {
 
                    get
 
                    {
 
                          return this.lnkprev;
 
                    }
 
                    set
 
                    {
 
                          this.lnkprev=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.HyperLink Lnknext
 
              {
 
                    get
 
                    {
 
                          return this.lnknext;
 
                    }
 
                    set
 
                    {
 
                          this.lnknext=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.HyperLink Lnkfist
 
              {
 
                    get
 
         &nbs
p;          {
 
                          return this.lnkfist;
 
                    }
 
                    set
 
                    { this.lnkfist=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.HyperLink Lnklast
 
              {
 
                    get
 
                    {
 
                          return this.lnklast;
 
                    }
 
                    set
 
                    {
 
                          this.lnklast=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.HyperLink Lnkjump
 
              {
 
                    get
 
                    {
 
                          return this.lnkjump;
 
                    }
 
                    set
 
                    {
 
                          this.lnkjump=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.Label Pagenum
 
              {
 
                    get
 
                    {
 
                          return this.pagenum;
 
                    }
 
                    set
 
                    {
 
                          this.pagenum=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.Label Pagecount
 
              { get
 
                    {
 
                          return this.pagecount;
 
                    }
 
                    set
 
                    {
 
                          this.pagecount=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.DropDownList List
 
              { get
 
                    {
 
                           le="color: blue;">return this.list;
 
                    }
 
                    set
 
                    {
 
                          this.list=value;
 
                    }
 
              }
 
              
 
              public System.Web.UI.WebControls.Panel PagedPanel
 
              {
 
                    get
 
                    {
 
                          return this.pagedPanel;
 
                    }
 
                    set
 
                    {
 
                          this.pagedPanel=value;
 
                    }
 
              }
 
              
 
              //针对一般数据邦定,不执行sqlstr
 
              public void datapage(DataSet ds,int pagenum)
 
              {
 
                    PagedDataSource objPds = new PagedDataSource();
 
                    objPds.AllowPaging =true;
 
                    //每页显示数目
 
                    objPds.PageSize =pagenum;
 
                    //指定数据源
 
                    objPds.DataSource = ds.Tables[0].DefaultView;
 
                    int CurPage;
 
                    //绑定dropdownlist数据
 
                    for(int i=1;i<=objPds.PageCount;i++)
 
                    {
 
                          this.list.Items.Add(i.ToString());
 
                    }
 
                    this.list.Items.Insert(0,new ListItem("页数",""));
 
                    //确定当前页数
 
                    if (System.Web.HttpContext.Current.Request.Params["Page"] != null)
 
     &nb
sp;              {
 
                          CurPage=Convert.ToInt32(System.Web.HttpContext.Current.Request.Params["Page"]);
 
                    }
 
                    else
 
                    {
 
                          CurPage=1;
 
                    }
 
                    
 
                    objPds.CurrentPageIndex = CurPage-1;
 
                    if (objPds.PageCount>1)

<
/tbody>

 
                    {
 
                          pagedPanel.Visible = true;
 
                    }
 
                    else
 
                    {
 
                          pagedPanel.Visible = false;
 
                    }
 
                    //显示当前页数
 
                    this.pagenum.Text="当前:"+CurPage.ToString()+"页";
 
  &
nbsp;                 //显示总共页数
 
                    this.pagecount.Text="共有"+objPds.PageCount+"页";
 
                    //下一页
 
                    if (!objPds.IsLastPage)
 
                    {
 
                          lnknext.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page=" + Convert.ToString(CurPage+1);
 
                    }
 
                    //上一页
 
                    if(!objPds.IsFirstPage)
 
                    {
 
                          lnkprev.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(CurPage-1);
 
                    }
 
                    //第一页
 
                    if(CurPage!=1)
 
                    {
 
                          lnkfist.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(1);
 
                    }
 
                    //最后一页
 
                    if(CurPage!=objPds.PageCount)
 
                    {
 
                          lnklast.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(objPds.PageCount);
 
                    }
 
                    //绑定datagrid
 
                    if(this.datagrid!=null)
 
                    {
 
                          datagrid.DataSource=objPds;
 
                          datagrid.DataBind();
 
                    }
 
                    //绑定datalist
 
                    if(this.datalist!=null)
 
                    {
 
                          datalist.DataSource=objPds;
 
                          datalist.DataBind();
 
                    }
 
                    //绑定repeater
 
                    if(this.repeater!=null)
 
                    {
 
                          repeater.DataSource=objPds; >
 
                          repeater.DataBind();
 
                    }
 
              }
 
              
 
              //重载,针对执行sqlstr
 
              public void datapage(string sqlcon,string sqlstr,int pagenum)
 
              {
 
                    SqlConnection objConn = new SqlConnection(sqlcon);
 
                    SqlDataAdapter objCommand = new SqlDataAdapter(sqlstr,objConn);
 
                    DataSet ds = new DataSet();
 
                    objCommand.Fill(ds);
 
                    PagedDataSource objPds = new PagedDataSource();
 
                    objPds.AllowPaging = true;
 
                    //每页显示数目
 
                    objPds.PageSize = pagenum;
 
                    //指定数据源
 
                    objPds.DataSource = ds.Tables[0].DefaultView;
 
                    int CurPage;
 
   
                 //绑定dropdownlist数据
 
                    for(int i=1;i<=objPds.PageCount;i++)
 
                    {
 
                          this.list.Items.Add(i.ToString());
 
                    }
 
                    this.list.Items.Insert(0,new ListItem("页数",""));
 
                    //确定当前页数
 
                    if (System.Web.HttpContext.Current.Request.Params["Page"] != null)
 
                    {
 
                          CurPa
ge=Convert.ToInt32(System.Web.HttpContext.Current.Request.Params["Page"]);
 
                    }
 
                    else
 
                    {
 
                          CurPage=1;
 
                    }
 
                    
 
                    objPds.CurrentPageIndex = CurPage-1;
 
                    if (objPds.PageCount>1)
 
                    {
 
                          pagedPanel.Visible = true;
 
                    }
 
                    else
 
                    {
 
                          pagedPanel.Visible = false;
 
                    }
 
                    //显示当前页数
 
                    this.pagenum.Text="当前:"+"第"+CurPage.ToString()+"页";
 
                    //显示总共页数
 
            &
nbsp;       this.pagecount.Text="共有"+objPds.PageCount+"页";
 
                    //下一页
 
                    if (!objPds.IsLastPage)
 
                    {
 
                          lnknext.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page=" + Convert.ToString(CurPage+1);
 
                    }
 
                    //上一页
 
                    if(!objPds.IsFirstPage)
 
                    {
 
                          lnkprev.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(CurPage-1);
 
                    }
 
                    //第一页
 
                    if(CurPage!=1)
 
                    {
 
                          lnkfist.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(1);
 
                    }
 
                    //最后一页
 
                    if(CurPage!=objPds.PageCount)
 
                    {
 
                          lnklast.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(objPds.PageCount);
 
                    }
 
                    //绑定datagrid
 
                    if(this.datagrid!=null)
 
                    {
 
                          datagrid.DataSource=objPds;
 
                          datagrid.DataBind();
 
                    }
 
                    //绑定datalist
 
                    if(this.datalist!=null)
 
                    {
 
                          datalist.DataSource=objPds;
 
                          datalist.DataBind();
 
                    }
 
                    //绑定repeater
 
                    if(this.repeater!=null)
 
                    {
 
                          repeater.DataSource=objPds;
 
                          repeater.DataBind();
 
                    }
 
              }
 
              
 
              //dropdownlist选择改变
 
              public void select()
 
              {
 
                    this.lnkjump.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(this.list.SelectedItem.Value);
 
              }
 
              
 
        }
 
  }
 
   
 
   
 
   
 
   
2003年12月26日我的文章

评论关闭

ASP.NET 2.0的一些新特性(仅针对开发人员)

原作者:Sreedhar Koganti,翻译:NetFire(Fire.Rolland.Han)翻译得到了原作者许可。
原文:http://www.w3coder.com/alphatalks/aspnet20.aspx
注:本文已经发表到“程序春秋”杂志2003年12期。现转发CSDN,版权属于NetFire本人、杂志社和CSDN,如需转载请联系本人或杂志社
杂志上发的是最终稿,我找不到了。下面的版本不知道是什么时候的了:(

开篇语:

在这篇文章中,我将向大家介绍一下WINDBEY的一些有趣的新特性。哦?是Whidbey?别搞混了,Whidbey就是V2的内部开发代号。(下文中V1表示ASP.NET 1.0,V2表示ASP.NET 2.0)

正文:

好吧,让我们来讲讲V2;V2是MICROSOFT.NET的下一代应用程序开发平台的“起始点”。据说它也是Yukon的一部分。别着急,MICROSOFT将会在即将的PDC大会上向您揭开V2 ALPHA的面纱。好了,让我们言归正传。(PDC——Microsoft Professional Developers Conference,简称为PDC;Yukon——微软下一代的SQL Server的内部开发代号)

在V2中有以下一些有趣的新特征:

a) 和v1相比,在v2中代码行减少了70%,这是不是很让人兴奋?

b) 新的VS.NET(Whidbey)将会带给使用者友好的、让人兴奋得新特性,这会让开发人员的编程生活变得非常容易。

另外,在新版本的VS.NET中,有以下一些新特性。

1. 无项目的项目系统“Project-less”

如果你是从ASP转过来的开发人员,你将会为这个前景感到非常兴奋的。

2. Web站点将支持FileSystem,IIS,FTP和FPSE(Frontpage服务器扩展包)。

3. 同时支持代码分离和页面嵌入服务器端代码两种模式。

4. 完全的功能更强的智能语法和调试支持。

5. Html代码保存;

微软官方说这次它肯定有作用。所以对于ms阵营的开发者来说,这绝对是个好消息。

6. 支持真正的XHTML标准,以及动态插件的引擎;

7. 更加全面的支持数据库的设计;

8. 在ASP.NET中增加了40多个新的控件。我相信他们将会给开发人员的工作带来极大的方便。

下面分类介绍这些控件:

Login/Security Controls:
这里面有5个控件,他们非别是——
a) Login
b) LoginView
c) PasswordRecovery
d) LoginStatus
e) LoginName
这些都是使用起来非常方便的控件,并且这些控件将会让开发登陆安全系统的应用程序变得非常简单。

(图一:Whidbey的工具箱Security控件截图)

Data/DataSource控件:

下面是ASP.NET 2.0中新的Data Source控件:

1.
2.
3.
4.
5.
6.

下面是ASP.NET 2.0中新的Data Bound 控件:
1.
2.
3.
4. (Beta timeframe)

(图二:Whidbey的工具箱Data控件截图)

Personalization:

在 ASP.NET的Personalization控件中,信息是以一种固定的格式存储,并且和特定的用户相关联。ASP.NET的 Personalization控件使得我们可用简单的方法来管理用户的信息,而不必非要去使用数据库(这就免去了创建和维护数据库的劳累工作)。另外,Personalization系统为我们处理用户信息相关的这类问题时提供了一组规范、易用、强大的API,使得我们的应用程序能够随时随地的使用。

下面是一些私有化控件的名字:

a) WebPartManager
b) WebPartZone
c) ContentWebPart
d) CatalogZone
e) PageCatalogPArt
f) EditorZone
g) TemplateCatalogPart
h) AppearanceEditorPart
i) LayoutEditorPart

(图三:Whidbey的工具箱Data控件截图)

Navigation:

这个Navigation控件帮助我们方便的在ASP.NET站点中创建导航。在一个站点中,我们可以用站点题图描述这个站点的逻辑结构。当然,我们可以简单的修改站点地图来管理页面的导航,也可以为了管理页面导航做很多修改。

(图四:Whidbey的工具箱Navigation控件截图)

下面是另外一些新的控件(至于这些控件的名字,大家可以猜一下):

1) Wizard

2) Image Generation
3) Multi-View
4) ImageMap
5) Mobile controls 等等

Master Pages:
这个特性对许多站点都是有用的。借助master pages, 我们可在程序中进行一致的页面布局。在我们的应用程序中, master page为所有的页面定制了一个通用的外观和标准行为。之后,我们可使用该Master Pages创建单独的页面实例,这些页面自然将包含以上这些通用特性。你能够在Wilson 的Blog —Master Pages details at paul Wilson blog中找到与此有关的内容。网址是—http://weblogs.asp.net/pwilson/posts/33273.aspx

Web Admin Tool:
  在ASP.NET 2.0中,这是我最喜欢的一个新特性之一。这个工具将帮助我们配置web.config文件中的信息。所以,当在一个产品的应用中,不需要打开 web.config文件来修改配置。就像IIS的虚拟目录配置一样,无论在什么时候在需要时,只要用这个工具修改一些属性就可以了。比如需要修改 web.config文件中的数据库联接串的时候。在IIS站点属性中,你就可以找到名为ASP.NET的选项卡,它将帮助我们配置和管理 web.config文件。下图是在IIS站点属性中的ASP.NET选项卡下的web admin tool。

(图五:IIS中Web Admin Tool截图)

(点击“ Edit Configuration”按钮后, 所显示的内容截图)

Cross Page Posting:

这是ASP.NET 2.0中我喜欢的另一个新特性。以前,在页面之间传递数据是一件很痛苦的事情。但现在在ASP.NET 2.0中,这变得非常简单容易。

页面现在可以提交到另外一页,同时最初的服务器控件可被访问。这是不是让您耳目一新?

怎么完成呢?完成它只需要非常简单的两个操作步骤,他们是:

1. 设置“PageTargetUrl”属性,在按钮和服务器控件中,它将引发页面之间的提交;

2. 在目标页中的相关控件的原使页面中使用“PreviousPage”属性。

  好了,现在就可以控制前页的控件传送的数据了!

客户端脚本:
现在我们可以说说新增的客户端脚本支持,它们分别是:

a) Focus
b) Scrolling
c) Client Events
d) Out of band call backs to server

现在我们同样可以从新闻组中获得相关的支持。我认为这也是ASP.NET 2.0很不错的新特征。

总结:

上面我们非常简要的讨论了所涉及的新特征,这里没有提及象Mobility, Health Monitoring/Operations, Hosting,Copy Web in Visual Studio等新的特征。不要认为ASP.NET 2.0只有以上这些新特征。在文章中,我只是简要的介绍了一些相对来说重要的新特征,这里说到的只是冰山一角。现在ASP.NET 2.0仅仅是在测试阶段,也许正式发布的时候还有更多的新东西等着我们,让我们拭目以待吧!

2003年10月27日我的文章

评论关闭

从ASP.NET数据库某字段为空时的处理所衍生出来的思考

对于数据库字段为空时,在B/S结构下的处理方式很多,而到了dotNet时代,就和原来有了本质的不同,根本就在于更强调服务器的自行处理。下面一步一步地从大家最熟悉的东西开始说。

首先用一个简单的ASP+Access留言本为例。数据库中对于每一个留言都有对应的一个回复,并且,只要回复了的留言将会用一个数据类型未bit的messageStatus字段来标记,回复了的用“1”来标记,否则用“0”(下面只给出关键部分代码,也就是判断messageStatus字段的值是真还是假):

<%
if messageRs("messageStatus")=False then
%>
................(此处省略了html代码)
<%
else
set replyRs = Server.CreateObject("adodb.recordset")
replySql = "select * from reply where messageId = " & messageRs("messageId")
replyRs.Open replySql,conn
%>
................(此处省略了html代码)
<%
replyRs.Close
set replyRs = nothing
end if
%>

而在ASP.NET中,由于程序代码已经完全可以和html代码分开,加上所提供的服务器端控件,使我们必须要找到一种适合于ASP.NET的方式。下面就直接进入我们的正题,和大家一起探讨在ASP.NET如何更好的实现。

下面列出笔者所知道的三种方法。下面还以留言板为例。

第一种——

可以这样解决,在cs页里写一函数,用于判断一个帖子是否有回复,如果有回复,则返回回复的内容,没有则返回“无回复”。然后把这个方法绑定到DataGrid或者DataList,或者Reapter空间的itemtemplate中的一个Label控件上。

下面是一个例子,用于显示某个图片,首先用IsImageAvailable()方法判断是否存在这幅图片,返回是一个布尔值,从而控制img控件和Label控件是否显示.如果有图片,则img控件显示,否则显示Label控件。


  
		
		
  
//IsImageAvailable()函数
private bool IsImageAvailable(String strLastName){
       String strImageFile = "images\\" + strLastName + ".bmp";
       return File.Exists(Server.MapPath(strImageFile));
}

解决思路大概就是这样,当没有图片时用Label控件显示”No picture available”。

第二种——

留言板的数据显示使用DataGrid控件,那么就容易了。使用DataGrid控件显示数据的时候,如果字段值为NULL,它会自动默认为空。所以我们可以把数据存为一个DATASET,然后再绑定到DataGrid上,使用FOR 循环来判断,如果一个字段为空,如下赋值:

for (int i, i



第三种——

直接只用SQL语句。大家先来看看这样一个SQL语句:

SELECT GuestName,GuestContact,GuestEmot,PostTitle,PostContent,PostTime,PostIP,case when(ReplyContent IS NULL) then '未回复' else ReplyContent end AS reply FROM GuestBook ORDER BY Id DESC

这里出现了一个case when() then … else …end as,下面来看看它的具体用法。

CASE

计算条件列表并返回多个可能结果表达式之一。

CASE 具有两种格式:

1、简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。

2、CASE 搜索函数计算一组布尔表达式以确定结果。

两种格式都支持可选的 ELSE 参数。

语法

简单 CASE 函数:

CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END

CASE 搜索函数:

CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END

参数

input_expression

是使用简单 CASE 格式时所计算的表达式。Input_expression 是任何有效的 Microsoft® SQL Server™ 表达式。

WHEN when_expression

使用简单 CASE 格式时 input_expression 所比较的简单表达式。When_expression 是任意有效的 SQL Server 表达式。Input_expression 和每个 when_expression 的数据类型必须相同,或者是隐性转换。

n

占位符,表明可以使用多个 WHEN when_expression THEN result_expression 子句或 WHEN Boolean_expression THEN result_expression 子句。

THEN result_expression

当 input_expression = when_expression 取值为 TRUE,或者 Boolean_expression 取值为 TRUE 时返回的表达式。result expression 是任意有效的 SQL Server 表达式。

ELSE else_result_expression

当比较运算取值不为 TRUE 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUE,CASE 将返回 NULL 值。Else_result_expression 是任意有效的 SQL Server 表达式。Else_result_expression 和所有 result_expression 的数据类型必须相同,或者必须是隐性转换。

WHEN Boolean_expression

使用 CASE 搜索格式时所计算的布尔表达式。Boolean_expression 是任意有效的布尔表达式。

结果类型

从 result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。

那么,总结一下上面说过的三种方法:

1、  第一种方法,需要额外写一个处理函数。增加了工作量;

2、  利用了dotNet中的DataSet,对于能熟练运用的朋友来说不成问题,但是对于初学者这个就有点困难了。而且也没有从减少代码量角度来考虑;

3、  充分利用了SQL语句,将空字段的处理完全交给服务器来完成,不需要额外写任何的代码。

其实,不管是做B/S结构的程序还是做C/S结构的,都离不开和数据库关联,那么一个好的SQL语句,将会带来极大的方便。DotNet时代的到来,将会进一步加快我们走向完整的三层体系结构,如上面说到的程序中直接利用SQL语句将是不规范的,以后的程序都将分为数据层、中间层、应用层,那么数据层的开发,其实还是直接、或者间接的和SQL语句关联,所以充分挖掘现有的SQL语句的功能将会非常有必要。