您的位置:首页 > 编程语言 > ASP

asp.net初学习实现简单的增删改查功能

2012-05-09 23:58 429 查看
    在学习中发现网页模板可以大大节约重复的页面代码,同时对于WebSite开发的程序在不同的页面直接调用已写好的代码既不方面,只是作为代码量不大的程序进行开发还是比较方便。

    get和post的区别get是通过url传递表单值,post通过url看不到表单域的值;get传递的数据量是有限的,如果要传递大数据量不能用get,比如上传文章、传递密码或者<textarea>发表大段文章,post则没有这个限制;post会有浏览器提示重新提交表单的问题。也就是说get和post都是以不同的方式提交表单的信息,只是方式不一样,post是以头报文的形式传递,我们可以使用火狐的免费插件firebug或者免费的httpwatch(破解版的当然免费),看到这些。

    简单的说浏览器和服务器直接就是请求和回应,内部的具体细节可以看看博客园中的很多示例图,当然我们可以分析一下,就是浏览器通过DNS解析后向服务器发送请求,服务端侦听到客户端(浏览器)请求,开始分配相应套接字并建立连接,之后就是一方发送一方接收回应的过程,这里面存在一个长连接短连接的概念,具体还是查资料,这里就不多说了。

    现在我们先来分析一下已经生成好的web程序,我们来反编译看下具体的执行过程。

我们只看其中关键的部分,也是我们一般程序中的主体部分,使用reflector

[CompilerGlobalScope]
public class default_aspx : _Default, IHttpHandler
{
// Fields
private static object __fileDependencies;
private static bool __initialized;

// Methods
[DebuggerNonUserCode]
public default_aspx();
[DebuggerNonUserCode]
private HtmlHead __BuildControl__control2();
[DebuggerNonUserCode]
private HtmlTitle __BuildControl__control3();
[DebuggerNonUserCode]
private HtmlForm __BuildControlform1();
[DebuggerNonUserCode]
private void __BuildControlTree(default_aspx __ctrl);
[DebuggerNonUserCode]
protected override void FrameworkInitialize();
[DebuggerNonUserCode]
public override int GetTypeHashCode();
[DebuggerNonUserCode]
public override void ProcessRequest(HttpContext context);
}

Expand Methods


它对应的源代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>测试</title>
</head>
<body>
<form id="form1" runat="server">
<div>

</div>
</form>
</body>
</html>


现在我们再来看关键的部分:

[DebuggerNonUserCode]
private void __BuildControlTree(default_aspx __ctrl)
{
this.InitializeCulture();
IParserAccessor accessor = __ctrl;
accessor.AddParsedSubObject(new LiteralControl("\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n"));
HtmlHead head = this.__BuildControl__control2();
accessor.AddParsedSubObject(head);
accessor.AddParsedSubObject(new LiteralControl("\r\n<body>\r\n    "));
HtmlForm form = this.__BuildControlform1();
accessor.AddParsedSubObject(form);
accessor.AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>\r\n"));
}


从上面可以看出,.NET运行时将html创建成一个树对象,而后已以创建节点对象模型

[DebuggerNonUserCode]
private HtmlTitle __BuildControl__control3()
{
HtmlTitle title = new HtmlTitle();
IParserAccessor accessor = title;
accessor.AddParsedSubObject(new LiteralControl("测试"));
return title;
}


这里我只是让大家能看到 <title>测试</title>的效果,具体的可以自己看看。

下面就写个小代码试下手感受下asp.net web开发,基本原理都差不多只是对于刚从Winform转过来的同学感觉上很繁琐,节约时间不多说了,直接上代码,代码简单就是为了自己熟悉测试的

<%@ WebHandler Language="C#" Class="List" %>

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;

public class List : IHttpHandler {

public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/html";
DataTable dt = SqlHelper.ExecuteDataTble();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (DataRow dr in dt.Rows)
{
sb.AppendLine(" <tr>");
sb.AppendLine("<td>" + dr["s_no"] + "</td>");
sb.AppendLine("<td>" + dr["s_name"] + "</td>");
sb.AppendLine("<td>" + dr["s_sex"] + "</td>");
sb.AppendLine("<td>" + dr["s_birthday"] + "</td>");
sb.AppendLine("<td>" + dr["s_avgrade"] + "</td>");
sb.AppendLine("<td>" + dr["s_dept"] + "</td>");
sb.AppendLine("<td><a href=del.ashx?id="+dr["s_no"]+">删除</td>");
sb.AppendLine("<td><input type='checkbox' name='ckdel' value= '"+ dr["s_no"]+"'/>选择</td>");
sb.AppendLine("<td><a href='UpdateRecord.ashx'>修改</td>");
sb.AppendLine("<tr>");
}
string content = System.IO.File.ReadAllText(context.Server.MapPath("model.htm"));
content = content.Replace("@replace", sb.ToString()).Replace("@title", "学生信息表");
context.Response.Write(content);
}

public bool IsReusable {
get {
return false;
}
}

}
public class SqlHelper
{
public static System.Data.DataTable ExecuteDataTble()
{
using (SqlConnection con = new SqlConnection("Data Source=ROHELM-PC;Initial Catalog=T-SQL练手;Integrated Security=True"))
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "select * from student";
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
return dt;
}
}
}
}


下面这个其实保存的形式是什么无关紧要的,只要是文本形式就行。

SQL

USE [T-SQL练手]
GO
/****** Object:  Table [dbo].[student]    Script Date: 05/10/2012 00:05:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[student](
[s_no] [int] NOT NULL,
[s_name] [nvarchar](50) NOT NULL,
[s_sex] [char](2) NULL,
[s_birthday] [smalldatetime] NULL,
[s_speciality] [varchar](50) NULL,
[s_avgrade] [numeric](3, 1) NULL,
[s_dept] [varchar](50) NULL,
CONSTRAINT [PK__student__2F36BC5B7F60ED59] PRIMARY KEY CLUSTERED
(
[s_no] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Default [DF__student__s_speci__03317E3D]    Script Date: 05/10/2012 00:05:40 ******/
ALTER TABLE [dbo].[student] ADD  CONSTRAINT [DF__student__s_speci__03317E3D]  DEFAULT ('计算机软件与理论') FOR [s_speciality]
GO
/****** Object:  Default [DF__student__s_dept__0519C6AF]    Script Date: 05/10/2012 00:05:40 ******/
ALTER TABLE [dbo].[student] ADD  CONSTRAINT [DF__student__s_dept__0519C6AF]  DEFAULT ('计算机科学系') FOR [s_dept]
GO
/****** Object:  Check [CK__student__s_avgra__0425A276]    Script Date: 05/10/2012 00:05:40 ******/
ALTER TABLE [dbo].[student]  WITH CHECK ADD  CONSTRAINT [CK__student__s_avgra__0425A276] CHECK  (([s_avgrade]>=(0) AND [s_avgrade]<=(100)))
GO
ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__s_avgra__0425A276]
GO
/****** Object:  Check [CK__student__s_birth__023D5A04]    Script Date: 05/10/2012 00:05:40 ******/
ALTER TABLE [dbo].[student]  WITH CHECK ADD  CONSTRAINT [CK__student__s_birth__023D5A04] CHECK  (([s_birthday]>='1970-1-1' AND [s_birthday]<='2000-1-1'))
GO
ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__s_birth__023D5A04]
GO
/****** Object:  Check [CK__student__s_sex__014935CB]    Script Date: 05/10/2012 00:05:40 ******/
ALTER TABLE [dbo].[student]  WITH CHECK ADD  CONSTRAINT [CK__student__s_sex__014935CB] CHECK  (([s_sex]='男' OR [s_sex]='女'))
GO
ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__s_sex__014935CB]
GO


运行效果:



 其他操作显示区域没有调整好,且受到上传图片的限制未演示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: