二、利用EnterpriseFrameWork快速开发Web系统(B/S)
EnterpriseFrameWork框架实例源代码下载: 实例下载
本章通过一个开发实例来讲解Web系统的开发经过,以及会碰到的一些问题。实例功能就是业务系统中最常见的增、删、改、查来演示,用一个界面来管理自己的书籍,包括书籍名称、购买的价格、购买的时间、是否丢失;
步骤:数据库建表->新建项目->完成后台逻辑层代码->编写Web界面中的aspx和js代码,经过以上几个步骤完成代码的编写,之后只要调整配置文件,调试好程序就行啦。
本文要点:
1.Web版界面效果
2.Web项目开发步骤
3.代码文件调用关系图
4.常见问题汇总
1.先看看完成后的界面效果
2.开发步骤
1)数据库建表,贴出建表脚本
CREATE TABLE [Books]
(
[Id] [int] NOT NULL IDENTITY(1, 1),
[BookName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL,
[BuyPrice] [decimal] (18, 2) NULL,
[BuyDate] [datetime] NULL,
[Flag] [smallint] NULL CONSTRAINT [DF_Books_Flag] DEFAULT ((0))
) ON [PRIMARY]
GO
2)新建项目,同时引用好几个比要的程序集
3)完成后台逻辑层代码,主要包括Dao、实体和Web控制器,ObjectModel在实例中不会用到,因为太简单了没有必要用到它,用它只会让你的代码变得复杂;
我们先讲实体的代码,实体主要是在使用框架的ORM功能的必要代码,它把数据库表的所有字段都映射到实体的属性上,这样我们代码中操作数据库表的数据无需写sql,只需操作实体即可。下面看实体的代码,重点就是自定义标签的配置信息,详细用法会再后面的系列中介绍;还有就是所有实体都必须继承核心类库中的AbstractEntity对象。
Book.cs文件
using EFWCoreLib.CoreFrame.BusinessArchitecture.Orm;
namespace Books.Entity
{
[Serializable]
[Table(TableName = "Books", EntityType = EntityType.Table, IsGB = true)]
public class Book : EFWCoreLib.CoreFrame.BusinessArchitecture.AbstractEntity
{
private int id;
[Column(FieldName = "Id", DataKey = true, Match = "", IsInsert = false)]
//主键
public int Id
{
get { return id; }
set { id = value; }
}
private string bookName;
[Column(FieldName = "BookName", DataKey = false, Match = "", IsInsert = true)]
public string BookName
{
get { return bookName; }
set { bookName = value; }
}
private decimal buyPrice;
[Column(FieldName = "BuyPrice", DataKey = false, Match = "", IsInsert = true)]
public decimal BuyPrice
{
get { return buyPrice; }
set { buyPrice = value; }
}
private DateTime buyDate;
[Column(FieldName = "BuyDate", DataKey = false, Match = "", IsInsert = true)]
public DateTime BuyDate
{
get { return buyDate; }
set { buyDate = value; }
}
private int flag;
[Column(FieldName = "Flag", DataKey = false, Match = "", IsInsert = true)]
public int Flag
{
get { return flag; }
set { flag = value; }
}
}
}
接着看Dao的编写,Dao主要是编写ORM之外的一些数据库操作SQL脚本,所有的Dao都必须继承核心类库中的AbstractDao对象
bookDao.cs文件
namespace Books.Dao
{
public class BookDao : EFWCoreLib.CoreFrame.BusinessArchitecture.AbstractDao
{
public DataTable GetBooks(string searchChar, int flag)
{
string strsql = @"SELECT * FROM dbo.Books WHERE BookName LIKE '%{0}%' AND Flag={1}";
strsql = string.Format(strsql, searchChar, flag);
//oleDb是继承的父类中的操作数据库的对象
return oleDb.GetDataTable(strsql);
}
}
}
最后Web控制器的编写,控制器起着承上启下的作用,界面的请求都是具体到控制器中的某个方法,方法中调用上面的实体或Dao,再输出json数据返回给界面;一般来说一个控制器对应业务中的一个用列;所有控制器必须继承核心类库中的AbstractJqueryController对象
bookController.cs文件
namespace Books.WebController
{
[WebController]//是web控制器必须加上次标签
public class bookController : EFWCoreLib.WebFrame.Controller.AbstractJqueryController
{
[WebMethod]
public void SaveBook()
{
//从Http请求中的from表单里的数据复制到book对象
Book book = GetModel<Book>();
//更新到数据库中
book.save();
//返回界面提示
TxtJson = ReturnSuccess("保存书籍成功!");
}
[WebMethod]
public void SearchBook()
{
string schar = ParamsData["schar"];
int flag = Convert.ToInt32(ParamsData["flag"]);
BookDao bdao = NewDao<BookDao>();
//调用Dao里面的操作
DataTable dt = bdao.GetBooks(schar, flag);
//返回数据到界面网格
TxtJson = ToGridJson(dt);
}
}
}
4)编写Web界面中的aspx和js代码,其中aspx文件为HTML界面代码,JS文件主要为向后台发送请求的操作代码;界面框架用的是JqueryEasyUI,不了解此界面框架的可以网上学习下,也是一个用起来很简单的框架;当然界面框架不一定就只能用JqueryeasyUI,其他的一样都可以一起使用;
使用JqueryEasyUI框架aspx页面必须先引用这些文件;
Book.aspx文件代码
<%@ Page Language="C#" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>书籍管理</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="../../../WebPlugin/jquery-easyui-1.3.4/themes/default/easyui.css"/>
<link rel="stylesheet" type="text/css" href="../../../WebPlugin/jquery-easyui-1.3.4/themes/icon.css"/>
<script type="text/javascript" src="../../../WebPlugin/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="../../../WebPlugin/jquery-easyui-1.3.4/jquery.easyui.min.js"></script>
<script type="text/javascript" src="../../../WebPlugin/jquery-easyui-1.3.4/locale/easyui-lang-zh_CN.js"></script>
<script src="../../../WebPlugin/JQueryCommon2.0.js" type="text/javascript"></script>
<script src="Book.js" type="text/javascript"></script>
</head>
<body class="easyui-layout">
<div region="center" style="overflow:hidden;">
<div id="grid-tool">
<table cellpadding="0" cellspacing="0" style="width:100%">
<tr>
<td style="padding-left:2px">
<a href="#" class="easyui-linkbutton" plain="true" iconCls="icon-add" onclick="btn_add();">新增</a>
<a href="#" class="easyui-linkbutton" plain="true" iconCls="icon-edit" onclick="btn_alter();">修改</a>
</td>
<td style="text-align:right;padding-right:2px">
<input class="easyui-searchbox" data-options="prompt:'请输入书籍名称'" style="width:250px"></input>
</td>
</tr>
</table>
</div>
<table id="bookGird" class="easyui-datagrid" toolbar="#grid-tool" fit="true" border="false" singleSelect="true">
<thead>
<tr>
<th field="Id" width="100">序号</th>
<th field="BookName" width="80">书籍名称</th>
<th field="BuyPrice" width="120">购书价格</th>
<th field="BuyDate" width="200">购书时间</th>
<th field="Flag" width="80">是否丢失</th>
</tr>
</thead>
</table>
</div>
<%--弹出窗界面--%>
<div id="dialog-book" title="新增书籍" class="easyui-dialog" icon="icon-save" style="background:#fafafa;padding:10px;width:350px;height:250px;" buttons="#dlg-buttons1" resizable="true" modal="true">
<form id="bookform" method="post">
<table>
<tr>
<td><label>书籍名称:</label></td>
<td><input name="BookName" class="easyui-validatebox" style="width:200px;" type="text" required="true"></input></td>
</tr>
<tr>
<td><label>购书价格:</label></td>
<td><input name="BuyPrice" class="easyui-validatebox" style="width:200px;" type="text" required="true"></input></td>
</tr>
<tr>
<td><label>购书日期:</label></td>
<td><input name="BuyDate" class="easyui-datebox" style="width:200px;" type="text" required="true"></input></td>
</tr>
<tr>
<td><label>是否丢失:</label></td>
<td><input id="_flag" type="checkbox"/></td>
</tr>
</table>
<input id="book_id" type="hidden" name="Id" ></input>
<input id="book_flag" type="hidden" name="Flag" ></input>
</form>
</div>
<div id="dlg-buttons1">
<a href="#" class="easyui-linkbutton" onclick="btn_save();">确定</a>
<a href="#" class="easyui-linkbutton" onclick="$('#dialog-book').dialog('close');">取消</a>
</div>
</body>
</html>
Book.JS文件代码
//初始化入口
$(function() {
$('#dialog-book').dialog('close');
//加载网格数据
$('#bookGird').datagrid('options').url = 'Controller.aspx?controller=bookController&method=SearchBook&schar=&flag=0';
//$('#bookGird').datagrid('reload');
});
//添加
function btn_add(){
$('#dialog-book').dialog({ title: '新增书籍' });
$("#bookform").form('clear');
$("#book_id").val(0);
$("#book_flag").val(0);
$("#_flag").removeAttr("checked");
}
//修改
function btn_alter(){
$('#dialog-book').dialog({ title: '修改书籍' });
var selected = $('#bookGird').datagrid('getSelected');
if (selected) {
$("#bookform").form("load", selected);
if (selected.Flag == "1")
$("#_flag").attr("checked", "true");
else
$("#_flag").removeAttr("checked");
}
}
//保存
function btn_save() {
var ckval=$("#_flag").attr("checked")=="checked"?1:0;
$('#book_flag').val(ckval);
formSubmit('#bookform', 'Controller.aspx?controller=bookController&method=SaveBook', function() {
$('#dialog-book').dialog('close');
$('#bookGird').datagrid('reload');
});
}
说明一下下面向后台发ajax请求Url地址的参数意思:
$('#bookGird').datagrid('options').url = 'Controller.aspx?controller=bookController&method=SearchBook&schar=&flag=0';
Controller.aspx 框架内置的请求解析文件
controller=bookController 参数controller指定了后台的控制器类名
method=SearchBook 参数method指定了控制器中的方法名
schar=&flag=0 传递的两个参数schar和flag
3.最后我们看下图,整理一下以上代码文件的调用关系
4.常见问题汇总:
1)数据库连接配置修改
2)Web.config配置中不要忘记添加Books.dll
3)因为界面是在测试环境下运行,一定要把Web.config中的TurnOnLoginRight参数关闭
EnterpriseFrameWork框架实例源代码下载: 实例下载