在学习之前我们先了解一下asp.net里面的后缀及其优点:
asp.net:一般处理程序.ashx效率比较高效,WebForm(aspx)比较消耗资源,MVC(效率刚好介于两者之间)
asp.net里常用的文件
.ashx 一般处理程序HttpHandler,asp.net核心程序,但一般使用.aspx(常用于不需要返回大量html代码的时候)
.aspx 常用程序webForm,用于创建网页和网页进行编程的核心文件(前台文件)(要返回大量html)
.aspx.cs 用于编写大量的C#业务代码和.aspx配套使用
.ascx 指明一个 asp.net 用户定义控件
.asax 包含asp.net 应用程序级事件的事件语法
.config 配置文件,用于设置应用程序的各种属性
网页一般有两个请求分别是:
post方式的接收:context.Request.Form["textName"]
get 方式的接收:string name = context.Request.QueryString["name"]
我的代码是以post为例。
1、一般处理程序实现的删查改
1.配置返回格式和处理方法
public class UserinfoHandler : IHttpHandler, IRequiresSessionState
IHttpHandler定义ASP.NET以异步方式处理使用自定义HTTP处理程序的HTTP Web请求而实现的协定。
IRequiresSessionStateoo指定目标HTTP处理程序需要读取和写入访问为会话状态的值。这是一种标记接口,没有任何方法。
context.Response.ContentType = "application/json";
string retype = context.Request["btntype"]+"";
"application/json"这里表示给前端返回的数据类型是json格式
利用switch语句设置路由的功能
switch(retype) //(retype == "cx") 这里相当于路由功能
{
case "cx":
{
userSearch(context);
break;
}
case "xz":
{
userAdd(context);
break;
}
case "xg":
{
userEdit(context);
break;
}
case "sc": //删除
{
userDelete(context);
break;
}
case "toedit":
{
context.Response.Redirect("edituser.html");
break;
}
default:
{
context.Response.Write("老铁,404错误了");
break;
}
}
查询语句:查询所有语句并返回数据
private void userSearch(HttpContext context)
{
UserBll ub = new UserBll();
UserModel um=new UserModel();
List<UserModel> list=ub.getUserInfoList(um);
/*string restr = "{\"data\":[";
int i = 0;
foreach(UserModel user in list)
{
i++;
restr += "{\"username\":\""+user.userName+"\",\"sex\":\""+user.sex+"\"}";
if (i < list.Count)
{
restr += ",";
}
}
restr=restr+"] }";*/
string restr = "";
JavaScriptSerializer jss = new JavaScriptSerializer();
restr = jss.Serialize(list);
restr = "{\"code\":\"200\",\"data\":" + restr + "}";
context.Response.Write(restr);
}
删除语句:删除数据并返回未删除的全部数据
private void userDelete(HttpContext context)
{
UserBll ub = new UserBll();
int i=ub.deleteUserInfo(context.Request.QueryString["id"]);
if (i > 0)
{
context.Response.Write("{\"code\":\"200\",\"msg\":\"老铁,你删除成功!\"}");
}
else
{
context.Response.Write("{\"code\":\"999\",\"msg\":\"老铁,你删除失败!\"}");
}
}
修改语句:修改语句并返回全部数据
private void userEdit(HttpContext context)
{
string userid = context.Request.Form["id"];
string userName = context.Request.Form["username"];
//调用业务逻辑层代码进行修改操作
UserBll ub = new UserBll();
UserModel um = new UserModel();
um.userName = userName;
um.id = userid;
int i=ub.editUserInfo(um);
if (i > 0)
{
context.Response.Write("{\"code\":\"200\",\"msg\":\"老铁,你修改成功!\"}");
}
else
{
context.Response.Write("{\"code\":\"520\",\"msg\":\"老铁,你修改失败!\"}");
}
}
写完以上代码后我们还要把获得的数据返回到http里面,形成一个缓存,这样我们的前端人员才能访问并把我们的数据显示到前端界面。
public bool IsReusable
{
get
{
return false;
}
}
我这里使用了三层架构来实现删改查的功能:为什么使用三层架构呢?
因为使用三层架构不会造成代码冗余和冗长,使得代码整体看起来会整洁、简化、美观。最重要的一点是三层架构代码逻辑较简单,一个好的三层架构可以运用于很多的项目开发。我个人使用三层最大感受就是:使用三层架构后不用每一次访问数据库都要写一个访问数据库的方法,利用三层就可以直接调用;三层架构也可以帮助我们更快的写完增删改查这些语句。
三层架构的代码如下:
BLL层主要是辅助前端代码跟后端代码进行操作的
public string userLogin(UserModel um)
{
UserDal udal = new UserDal();
DataSet ds= udal.userLogin(um);
if (ds.Tables.Count < 1)
{
return null;
}
else if (ds.Tables[0].Rows.Count > 0)
{
return ds.Tables[0].Rows[0]["user_name"].ToString();
}
else
{
return null;
}
}
public List<UserModel> getUserInfoList(UserModel um)
{
UserDal udal = new UserDal();
return udal.getUserInfoList(um);
}
public int deleteUserInfo(string id) //执行删除的逻辑层代码
{
UserDal udal = new UserDal();
return udal.deleteUserInfo(id);
}
public int editUserInfo(UserModel um) //执行修改的逻辑层代码
{
UserDal udal = new UserDal();
return udal.editUserInfo(um);
}
public int addUserInfo(UserModel um) //执行修改的逻辑层代码
{
UserDal udal = new UserDal();
return udal.addUserInfo(um);
}
}
DAL层主要是用来处理数据库跟前端代码的联系
public class UserDal
{
//登录数据处理层
public DataSet userLogin(UserModel um)
{
string sqlstr = "select * from tbuser where user_name=@username and pwd=@password";
SqlParameter[] param =
{
new SqlParameter("@username",um.userName),
new SqlParameter("@password",um.pwd)
};
DataSet ds = SqlHelper.getDatasetData(param, sqlstr,true);
return ds;
}
public List<UserModel> getUserInfoList(UserModel um)
{
string sqlstr = "select * from tbuser where 1=1 ";
SqlParameter[] param = { };
if (um.userName != null)
{
sqlstr += " and user_name=@username";
SqlParameter s = new SqlParameter("@username", um.userName);
param.Append(s);
}
DataSet ds = SqlHelper.getDatasetData(param,sqlstr,true);
List<UserModel> list = new List<UserModel>();
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
foreach(DataRow dr in ds.Tables[0].Rows){
UserModel um1 = new UserModel();
um1.userName = dr["user_name"] + "";
um1.sex = dr["sex"] + "";
um1.id = dr["id"] + "";
um1.lcid = dr["lcid"] + "";
um1.pwd = dr["pwd"] + "";
um1.dormitory = dr["dormitory"] + "";
list.Add(um1);
}
}
return list;
}
public int deleteUserInfo(string id)
{
string sqlstr = "delete from tbuser where id=@userid";
SqlParameter[] param =
{
new SqlParameter("@userid",id)
};
int i = SqlHelper.sqlOperateData(sqlstr,param);
return i;
}
public int editUserInfo(UserModel um) //执行修改的数据层代码
{
string sqlstr = "update tbuser set user_name=@username where id=@userid";
SqlParameter[] param =
{
new SqlParameter("@userid",um.id),
new SqlParameter("@username",um.userName)
};
int i = SqlHelper.sqlOperateData(sqlstr, param);
return i;
}
public int addUserInfo(UserModel um) //执行新增的数据层代码
{
string sqlstr = "insert into tbuser(user_name,id,pwd) value(user_name=@username,id=@userid,pwd=@pwd)";
SqlParameter[] param =
{
new SqlParameter("@userid",um.id),
new SqlParameter("@username",um.userName)
};
int i = SqlHelper.sqlOperateData(sqlstr, param);
return i;
}
}
public static class SqlHelper
{
static string connstr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;//"server=.;database=hism;uid=sa;pwd=123456;";
static string yucheng = ConfigurationManager.ConnectionStrings["constr1"].ConnectionString;
public static DataSet getDatasetData(SqlParameter[] sqlParameters, string sqlstr, bool b)
{
string cstr = ""; //因为有两个链接,所想切换数据库
if (b)
{
cstr = connstr;
}
else
{
cstr = yucheng;
}
SqlConnection conn = new SqlConnection(cstr);
DataSet ds = new DataSet();
try
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sqlstr;
cmd.Connection = conn;
if (sqlParameters != null)
{
cmd.Parameters.AddRange(sqlParameters);
}
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(ds, "searchdata");
return ds;
}
catch (Exception ex)
{
DataTable dt = new DataTable();
DataColumn dc = new DataColumn();
dc.ColumnName = "错误提示";
dt.Columns.Add(dc);
DataRow dr = dt.NewRow();
dr["错误提示"] = ex.Message;
dt.Rows.Add(dr);
ds.Tables.Add(dt);
return ds;
}
finally
{
if (conn.State == ConnectionState.Open) //检查是否是打开的状态
{
conn.Close();
}
}
}
public static int getTotalCount(SqlParameter[] sqlParameters, string sqlstr, bool b)
{
int i = 0;
string cstr = ""; //因为有两个链接,所想切换数据库
if (b)
{
cstr = connstr;
}
else
{
cstr = yucheng;
}
SqlConnection conn = new SqlConnection(cstr);
try
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sqlstr;
cmd.Connection = conn;
if (sqlParameters != null)
{
cmd.Parameters.AddRange(sqlParameters);
}
i = int.Parse(cmd.ExecuteScalar().ToString());
}
catch (Exception ex)
{
i= 0;
}
finally
{
if (conn.State == ConnectionState.Open) //检查是否是打开的状态
{
conn.Close();
}
}
return i;
}
//执行增删改的语句
public static int sqlOperateData(string sqlstr,SqlParameter[] param)
{
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sqlstr;
cmd.Connection = conn;
if (param != null)
{
cmd.Parameters.AddRange(param);
}
int i = cmd.ExecuteNonQuery(); //专门执行 新增、修改、删除语句的
return i;
}
}
Model层主要是用来返回数据库中的数据,id对应的是表中的字段名
public class UserModel
{
public string id { get; set; }
public string userName { get; set; }
public string sex { get; set; }
//public int age { get; set; }
public string lcid { get; set; }
// public string remark { get; set; }
public string pwd { get; set; }
public string dormitory { get; set; }
}
2、利用WebFrom来调用接口实现删改查功能
首先利用阿贾克斯(ajax)来实现异步的http请求
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
由于我是利用From表单来传入我数据库的数据所有这里依然利用表单的格式来把数据渲染到我们前端的页面上
<form id="form1" runat="server">
<div>
用户信息:<br />
<input id="btnSearch" type="button" onclick="searchUserList()" value="查询"/>
<br />
<table class="auto-style1">
<thead>
<tr>
<td class="auto-style2">用户名</td>
<td class="auto-style3">性别</td>
<td class="auto-style2">学号</td>
<td class="auto-style2">楼层</td>
<td class="auto-style2">密码</td>
<td class="auto-style2">宿舍号</td>
<td class="auto-style4">操作</td>
</tr>
</thead>
<tbody id="tbuserinfo" >
</tbody>
</table>
利用阿贾克斯来把我们的数据渲染到前端
<script>
function searchUserList(){
//alert("1111");
$.ajax({
type: "post",
url: "UserinfoHandler.ashx",
data: {"btntype":"cx"},
success: function (res) {
//console.log(res);
var tbstr = "";
for (var i = 0; i < res.data.length; i++) {
tbstr += "<tr><td>" + res.data[i].userName + "</td >" +
"<td>" + res.data[i].sex + " </td>" +
"<td>" + res.data[i].id + " </td>" +
"<td>" + res.data[i].lcid + " </td>" +
"<td>" + res.data[i].pwd + " </td>" +
"<td>" + res.data[i].dormitory+ " </td>" +
"<td><input id=\"btnadd\" type=\"button\" onclick=\"addUser(" + res.data[i].id + ",'" + res.data[i].userName + "')\" value=\"新增\"/>" +
"<input id=\"btnedit\" type=\"button\" onclick=\"editUser(" + res.data[i].id + ",'" + res.data[i].userName + "')\" value=\"修改\"/>" +
"<input id=\"btndelete\" type=\"button\" onclick=\"deleteUser(" + res.data[i].id + ")\" value=\"删除\"/>" +
"</td></tr >";
}
$("#tbuserinfo").html(tbstr);
},
error: function (res) {
}
});
}
//修改用户
function editUser(id, userName) {
window.location = "edituser.html?id=" + id + "&userName=" + userName;
}
function addUser(id, userName) {
window.location = "add.html?id=" + id + "&userName=" + userName;
}
//删除用户
function deleteUser(id) {
$.ajax({
type: "get",
url: "UserinfoHandler.ashx?btntype=sc&id=" + id,
data: {},
success: function (res) {
//console.log(re);
if (res.code == "999") {
alert(res.msg)
}
else {
//searchUserList();
alert(res.msg)
}
},
error: function (res) {
}
});
}
</script>
查询语句是post请求,我们前端调用时就要发post的请求不然请求不到数据,删除是get请求,修改是post请求。
这个便是前端渲染的界面。
我们前端访问的接口地址是哪个呢?相信有人会这样问,我们访问的地址就是我下面这个地址http://localhost:44328/UserinfoHandler.ashx
如果想让这个地址被外网链接,我们还需要配置服务器或者设置一个内网穿透,这里不推荐使用内网穿透因为容易被攻击。如果只是测试也可以使用内网穿透,但是要是想发布网站的话还是使用服务器好。总的来说asp.net的一般处理程序不仅可以使用自己的WebFrom访问还可以被别的前端人员写的代码进行访问,比如Vue之类的,只要是用得上接口来访问数据库并对数据库进行操作的前端人员都可以使用,因为接口不仅仅是返回数据,它更是我们前端人员直接访问我们后端人员所写的数据的一个关键桥梁。我们除了可以利用webFrom来测试我们的接口是否成功还有什么方法可以测试吗?我这里推荐一个我自己都在用的软件ApiPost这个软件可以保存我们写下的接口并测试它们有没有成功。我写的接口传了三个参数:他们分别是btntype、username和id。