首页 > 编程 > .NET > 正文

从零开始学ASP.NET

2024-07-10 12:56:42
字体:
来源:转载
供稿:网友
第一天

学习目的:

掌握最基本的label、textbox、button控件用法

掌握用stringbuider类连接字符串

理解服务器的环境变量


stringbuilder类:
命名空间是:system.text。

stringbuilder类是个高效的类,stringbuilder.append连接字符串的方法是非常快的。用于连接大量的字符串,其速度的优越性就会体现出来。

先举几个例子:
在cs或vb文件的头部加上
[c#]using system.text;
[vb]imports system.text

[c#]stringbuilder sbfirst = new stringbuilder();
sbfirst.append(“这是第一个学aspnet的例子</br>”);
sbfirst.append( “这个例子太简单</br>”);
sbfirst.append( “连三岁小陔都会做,我早知道了,嘿嘿。”);
response.write(sbfirst.tostring());

[vb]dim sbfirst as stringbuilder = new stringbuilder()
sbfirst.append(“这是第一个学aspnet的例子</br>”)
sbfirst.append( “这个例子太简单</br>”)
sbfirst.append( “连三岁小陔都会做,我早知道了,嘿嘿。”)
response.write(sbfirst.tostring)

下面就可以做正题了:
先建立一个c#的web应用程序工程,这废话我就少说了吧。
放一个button控件:id为btnshowvariable
放一个label控件:id为labservervariable

添加button的单击事件,如下代码
private void btnshowvariable_click(object sender, system.eventargs e)
{
labservervariables.text = "";

stringbuilder info = new stringbuilder();

foreach (object objvar in request.servervariables)
{
info.append("<span style='font-size:9pt'>");
info.append(objvar.tostring());
info.append(" = <font color=blue>");
info.append(request.servervariables[objvar.tostring()]);
info.append("</font></span><br>");
}

labservervariables.text = info.tostring();
}

结果显示:

图片如下:


这样我们就可以这样用
response.write(request.servervariables["remote_addr"]); // ip地址
response.write("<br>");
response.write(request.servervariables["url"]); // 网页的url

第二天

学习目的:


掌握文本框的用法

初次接触try…catch…语法

今天内容很轻松,用一个例子,输入年月日,判断输入是否正确

图片如下:


用个文本框,id分别为txtyear,txtmonth,txtdate;
检验按钮的代码为:
private void btncheck_click(object sender, system.eventargs e)
{
int year, month, date;

// 先把输入的字符转成int类型,如果非数字型,
// 会触发错误
try
{
year = convert.toint32(txtyear.text);
month = convert.toint32(txtmonth.text);
date = convert.toint32(txtdate.text);
}
catch
{
labcheckinfo.text = "输入的是非数字字符。";
return;
}

// 如果第一步检验合格,就把输入的数字转化为日期格式
// 如果不符合日期格式即引发错误
try
{
datetime dt = new datetime(year, month, date);
}
catch
{
labcheckinfo.text = "输入的数字不符合日期格式";
return;
}

labcheckinfo.text = "输入正确";
}

嗯,补充一下,关于stringbuider
在处理字符串的时候很多人喜欢+=,其实对于string来说,一旦定义了就无法更改了
所谓的+只是新建的一个新的string变量并赋值
所以对于尽量使用stringbuider的append的方法,这样将大量的节省服务器的资源

第三天

学习目的:


掌握下拉列表框的用法,并理解autopostback属性;

理解isposkback及用法;

初识datatable的增加列、行,与下拉列表框绑定的方法。

今天的内容稍多些,而且涉及一些比较常用的,如ispostback及datatable的基本用法。

知识点:
ispostback:在页面onload之间是false值,而当从服务器回传后,该值变为true。当页面中的button或imagebutton等触发事件,都会把表单回传到服务器,而返回时又会引发onload事件。为了节省服务器资源,有些加载中需进行一次,而不需要在回传后多次发生,可以用!isposkback来作为条件,那么页面第一次加载后,以后就不会发生。该属性可以帮助你提高程序的性能。
datatable:即数据表,.net 程序中最常用的类,特别是数据库开发中,没有该类的程序是不可想象的。

先做个小程序来练练手,很简单,就一个下拉菜单,取名dlstweb。在属性的itmes选项中打开以下对话框,添加各项:


图片如下:


aspx中的代码为:
<asp:dropdownlist id="dlstweb" style="z-index: 101; left: 32px;
position: absolute; top: 32px" runat="server"
width="88px" autopostback="true">
<asp:listitem value="http://www.sina.com.cn">新浪 </asp:listitem>
<asp:listitem value="http://www.sohu.com">搜狐</asp:listitem>
<asp:listitem value="http://www.163.com">网易</asp:listitem>
</asp:dropdownlist>

在下拉框的selectedindexchanged事件中的加入代码:
private void dlstweb_selectedindexchanged(object sender, system.eventargs e)
{
response.write("<script language=javascript>window.open('" +dlstweb.selectedvalue + "');</script>");
}

按f5运行,可是我们发现这下拉框选择时什么事也没发生。原来原因是出在下拉框的autopostback属性上,把它设为true后再试试,一切ok了。
下面我们增加些难度,下拉框中的内容很多情况下不是事先固定的,而是要动态添加。这里设计是用一数据表datatable与之联系起来。

另建一文件,按上添加一下拉框,取名dlstweb,先设autopostpack为false,否则在刚启动而面就触发selectedindexchanged事件,弹出窗口就乱飞了。
在onload事件中添加代码,注意datatable用法及isposkback
datatable属于system.data命名空间,所以如果页面没预添加,可以自行增加这一行。

private void page_load(object sender, system.eventargs e)
{
// 用ispostback判断,只在没有回传时才初始化
// 这样可以防止每次刷新或回传时,都执行一次以下代码
// 可以节省服务器的资源了。
if (!ispostback)
{
datatable dt = new datatable();
datarow dr;

// 在表中增加字段
dt.columns.add("webname", typeof(string));
dt.columns.add("weburl", typeof(string));

// 表中增加行
dr = dt.newrow();
dr["webname"] = "新浪";
dr["weburl"] = "http://www.sina.com.cn";
dt.rows.add(dr);

dr = dt.newrow();
dr["webname"] = "网易";
dr["weburl"] = "http://www.163.com";
dt.rows.add(dr);

dr = dt.newrow();
dr["webname"] = "搜狐";
dr["weburl"] = "http://www.sohu.com";
dt.rows.add(dr);

// 把表与下拉菜单绑定数据
dlstweb.datasource = dt;
dlstweb.datatextfield = "webname";
dlstweb.datavaluefield = "weburl";
dlstweb.databind();

// 开始时就把下拉菜单的autopostback设为false,
// 防止一开始就乱跳出网页来
dlstweb.autopostback = true;
}
}

下面的事件与前面一模一样了
private void dlstweb_selectedindexchanged(object sender, system.eventargs e)
{
response.write("<script language=javascript>window.open('" +dlstweb.selectedvalue + "');</script>");
}

小结:今天的一些知识非常重要,为了理解,程序的难度并不高。但这是以后程序设计的基础,所以这些你一定要掌握。
vb.net增加字段代码稍有不同,如下:

// 在表中增加字段
dt.columns.add("webname", gettype(string))
dt.columns.add("weburl", gettype(string))

其它都差不多了。

每四天

学习目的:


学习ado.net用法,并如何用datarearder读取数据

今天练习数据库的最基本用法,如何打开数据库。首先在网站设置文件web.config文件的<configuration>下方加入以下节点:

<configuration>

<appsettings>
<add key="数据库1" value="ex01.mdb" />
</appsettings>

……

该节点设置了数据库的路径,这样就可以很方便的调用数据库文件了,调用方法为:
server.mappath(configurationsettings.appsettings["数据库1"])
这是asp.net程序的通用方法,以后介绍的sql server数据库也是在此设置的。
好开始做程序,首先在cs文件的头部加入:
using system.configuration;
using system.data.oledb;
using system.text;
以下在page的load事件中,读取access数据库,并用表格显示出来:
private void page_load(object sender, system.eventargs e)
{
stringbuilder sbtable = new stringbuilder(); // 用于输出表格的语句

string strconnection = "provider=microsoft.jet.oledb.4.0;data source="
+ server.mappath(configurationsettings.appsettings["数据库1"]);

// 连接数据库的语句
oledbconnection conn = new oledbconnection(strconnection);
// 建立dbcommand对象
oledbcommand cmd = conn.createcommand();
cmd.commandtext = "select * from book";

// 打开数据库
conn.open();

// 用datareader读取数据
oledbdatareader dr = cmd.executereader();

sbtable.append("<table cellspacing='0' cellpadding='0' border='1'><tr>");
sbtable.append("<td>书名</td><td>作者</td><td>单价<td></tr>");
while (dr.read())
{
sbtable.append("<tr><td>");
sbtable.append(dr["booktitle"].tostring());
sbtable.append("</td><td>");
sbtable.append(dr["author"].tostring());
sbtable.append("</td><td>");
sbtable.append(dr["unitprice"].tostring());
sbtable.append("</td><tr>");
}
sbtable.append("</tr></table>");

// 记住dr用毕必须关闭,否则会阻塞服务器
dr.close();

// dbconnection是受托管的,可以不关闭
// 但为良好的编程习惯,应该关闭
conn.close();

response.write(sbtable.tostring());

}
显示结果

图片如下:

第五天

学习目的:


掌握ado.net打开sql server数据库的方法。

今天做个非常普通的例子,做一个用户登录框。主要是通过这个练习认识一下sql server数据库的连接方法。和昨天的例子方法基本相同,很容易掌握的。
先建立sql server数据库,库名为aspnetabc,并建立一member新表,建表sql如下:

create table [dbo].[member] (
[memberid] [int] identity (1, 1) not null ,
[membername] [nvarchar] (50) collate chinese_prc_ci_as not null ,
[password] [nvarchar] (50) collate chinese_prc_ci_as not null ,
[gender] [bit] not null ,
[birthday] [datetime] null ,
[email] [nvarchar] (50) collate chinese_prc_ci_as null
) on [primary]

alter table [dbo].[member] with nocheck add
constraint [pk_member] primary key clustered
(
[memberid]
) on [primary]

与上一例子差不多,在web.config文件中再增加一行:
<appsettings>
<add key="数据库1" value="ex01.mdb" />
<add key="sqldatabase1" value="data source=localhost;user id=sa;password=sa;initial catalog=aspnetabc;connect timeout=30" />
</appsettings>

在面中添加二个文本框,txtmembername、txtpassword,并设置txtpassword的textmode为password。设置按钮btnlogin。btnlogin的事件代码如下:

private void btnlogin_click(object sender, system.eventargs e)
{
// 先检验输入正确性
if (txtmembername.text == string.empty || txtmembername.text.trim() == "")
{
response.write("<script language=javascript>alert('帐号不能为空')</script>");
return;
}
if (txtpassword.text == string.empty || txtpassword.text.trim() == "")
{
response.write("<script language=javascript>alert('没有输入密码')</script>");
return;
}

string strconnection = configurationsettings.appsettings["sqldatabase1"];
string sqlmember = "select membername ,[password] from member "
+ " where membername = '" + txtmembername.text.trim() + "'"
+ " and [password] = '" + txtpassword.text.trim() + "'";

// 连接sqlserver数据库
sqlconnection conn = new sqlconnection(strconnection);
// 建立sqlcommand
sqlcommand cmd = conn.createcommand();
cmd.commandtext = sqlmember;
conn.open();
// 建立datareader
sqldatareader dr = cmd.executereader();

// 判断datareader是否为空记录
if (dr.hasrows)
{
response.write("<script language=javascript>alert('" + txtmembername.text + "欢迎你!')</script>");
}
else
{
response.write("<script language=javascript>alert('找不到该会员,或密码错误。')</script>");
}

// 千万不要忘记关闭datareader
dr.close();

conn.close();
}

好了,一个非常简单的登录框做好了。当然在实际程序中还应加入跳转等,这个就留给你做了。

第六天

学习目的


掌握如何用ado.net插入新的记录

我们学得好快,今天做一个简易的新闻发布网页,可以说是个演示型的,只是让大家能理插入数据的最主要步骤。掌握今天的内容,我们就有基础可以做一个稍有实用的新闻程序了。
为了不使注意力分散,程序没有加入输入的验证,很快我会接下去写一个验证输入的方法。


图片如下:


仍用昨天的方法新建一数据表,sql语句如下:
create table [dbo].[newsarticle] (
[newsarticleid] [int] identity (1, 1) not null ,
[title] [nvarchar] (50) collate chinese_prc_ci_as not null ,
[subtitle] [nvarchar] (50) collate chinese_prc_ci_as null ,
[content] [ntext] collate chinese_prc_ci_as not null ,
[writer] [nvarchar] (10) collate chinese_prc_ci_as null ,
[pubtime] [datetime] not null
) on [primary] textimage_on [primary]

alter table [dbo].[newsarticle] with nocheck add
constraint [df_newsarticle_pubtime] default (getdate()) for [pubtime],
constraint [pk_newsarticle] primary key clustered
(
[newsarticleid]
) on [primary]
go

按昨天的方法加入头部的语句,在提交按钮中建立以下事件:

private void btnpublish_serverclick(object sender, system.eventargs e)
{
string strconnection = configurationsettings.appsettings["sqldatabase1"];

// 连接sqlserver数据库
sqlconnection conn = new sqlconnection(strconnection);
// 建立sqlcommand
sqlcommand cmd = conn.createcommand();
cmd.commandtext = "insert into newsarticle (title, subtitle, writer, content) values ("
+ "'" + txttitle.text + "',"
+ "'" + txtsubtitle.text + "',"
+ "'" + txtwriter.text + "',"
+ "'" + txtcontent.text + "')";
conn.open();
//response.write (cmd.commandtext);

// 插入记录
try
{
cmd.executenonquery();
}
catch (exception ex)
{
response.write("<script language=javascript>alert('输入错误,数据库不能更新。')</script>");
}
finally
{
conn.close();
}
}

注意command对象的executenonquery()方法使用,该方法可以用于插入、更新、删除等操作,是command对象的重要方法。今天介绍了command语句的最基本用法,下次还将介绍占位符的用法。好了,各位先消化一下,明后天将做实用的东东了。
第七天

学习目的


接触验证控件

昨天介绍了sql server插入数据,但是我们省略了验证输入这一步。以前的做法是用语句逐个判断输入的正确性,如是否为空,长度是否超过等。现在.net中有了验证控件,可以使我们在编程的语句中大在简化了。今天介绍验证控件中最基本的一个,requeiredfieldvalidator控件,是用来判别否输入控件是否为空值,如为空则引发错误。

requeiredfieldvalidator可以用来验证textbox、listbox、dropdownlist、radiobuttonlist及html控件中的inputtext、textarea、select、inputfile等。

属性介绍:
controltovalidate:指点验证某一控件的控件名,如为空,将引发异常;
errormessage:错误提示信息;
isvalid:用于判断是否通过验证;
display:有三个值,none表示错误时不显示信息,但在validationsunmmary控件中显示;static表示不论错误提示是否出现,都占页面空间;dymatic:只有错误提示才占用空间。
text:文本内容。和errormessage一起使用时,将显示text错误信息。该种情况可以通过validationsummay控件显示errormessage属性的提示。

使用方法:
设置:
txttitle:maxlength(50);
txtsubtitle: maxlength(50);
txtwriter: maxlength(10);
这样可以防止输入过长字符串
rfvtitle:controltovalidate(txttitle)、errormessage(“标题必须输入。”)
rfvcontent:controltovalidate(txttitle)、errormessage(“内容必须输入。”)

这样在没有验证通过时,会出现下图信息提示,并不执行插入语句。直到验证正确后,才执行数据更新。


图片如下:

第八天

学习目的


学会sql中的占位符用法

在鲸鱼这几天忙死了,好几天没写了,真对不起各位。这几天让xhtml闹得不开心,虽然以前也知道这个,但没太在意。可现在我是如梦初醒,我发觉xhtml是个信号,所以这几天不得不仔细研究一下这个。很笨,我还没发觉xhtml的奥妙。确实如此,没上过台面,真不知这桌菜怎样好吃。少说了,回到正题。

先把以前的command的commandtext重新写过:
cmd.commandtext = "insert into newsarticle (title, subtitle, writer, content)"
+ " values ( @title, @subtitle, @writer, @content )";
这样代码是否很清晰了,我们可以避免一大串的难以看懂的的语句了。

接下来,我们就给这些定位符赋予属性和值了:
cmd.parameters.add("@title", sqldbtype.nvarchar, 50);
cmd.parameters.add("@subtitle", sqldbtype.nvarchar, 50);
cmd.parameters.add("@writer", sqldbtype.nvarchar, 10);
cmd.parameters.add("@content", sqldbtype.ntext);

以上我们给每个占位符定义一个值类型,相信不难看懂吧。接者再给于值:
cmd.parameters["@title"].value = txttitle.text.trim();
if (txtsubtitle.text == string.empty || txtsubtitle.text.trim() == "")
{
cmd.parameters["@subtitle"].value = dbnull.value;
}
else
{
cmd.parameters["@subtitle"].value = txtsubtitle.text.trim();
}
if (txtwriter.text == string.empty || txtwriter.text.trim() == "")
{
cmd.parameters["@writer"].value = dbnull.value;
}
else
{
cmd.parameters["@writer"].value = txtwriter.text;
}
cmd.parameters["@content"].value = txtcontent.text;

其实,也可以这样写:
cmd.parameters.add("@title", sqldbtype.nvarchar, 50) .value = txttitle.text.trim();
这要看你喜欢了。

不错吧,程序是否很有条理。

程序代码:
private void btnpublish_serverclick(object sender, system.eventargs e)
{
string strconnection = configurationsettings.appsettings["sqldatabase1"];

// 连接sqlserver数据库
sqlconnection conn = new sqlconnection(strconnection);
// 建立sqlcommand
sqlcommand cmd = conn.createcommand();
cmd.commandtext = "insert into newsarticle (title, subtitle, writer, content)"
+ " values ( @title, @subtitle, @writer, @content )";
conn.open();

cmd.parameters.add("@title", sqldbtype.nvarchar, 50);
cmd.parameters.add("@subtitle", sqldbtype.nvarchar, 50);
cmd.parameters.add("@writer", sqldbtype.nvarchar, 10);
cmd.parameters.add("@content", sqldbtype.ntext);

cmd.parameters["@title"].value = txttitle.text.trim();
if (txtsubtitle.text == string.empty || txtsubtitle.text.trim() == "")
{
cmd.parameters["@subtitle"].value = dbnull.value;
}
else
{
cmd.parameters["@subtitle"].value = txtsubtitle.text.trim();
}
if (txtwriter.text == string.empty || txtwriter.text.trim() == "")
{
cmd.parameters["@writer"].value = dbnull.value;
}
else
{
cmd.parameters["@writer"].value = txtwriter.text;
}
cmd.parameters["@content"].value = txtcontent.text;
// 插入记录
try
{
cmd.executenonquery();
}
catch (exception ex)
{
response.write("<script language=javascript>alert('输入错误,数据库不能更新。')</script>");
}
finally
{
conn.close();
}
}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表