利用ASP.NET MVC EasyUI SqlServer搭建企業開發框架

利用ASP.NET MVC EasyUI SqlServer搭建企業開發框架
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

我們要搭建的框架是企業級開發框架,適用用企業管理資訊系統的開發,如:OA、HR等

1、框架名稱:sampleFrame。

2、搭建原則:最少知識原則。

3、先定義一個簡單的編碼規範:除類名和介面名外,其餘首字母小寫。

4、準備開發環境:vs2010及以上(mvc4)、sqlserver、jquery2.0和easyui1.4.5

首先來看一下列表頁面的效果圖:

我們期望簡潔帶前臺程式碼,如下:


<table id="dataGrid" class="easyui-datagrid" url="getList" toolbar="#toolbar">
<thead>
<tr>
<th field="customerId" sortable="true" data-options="sortable:true" width="50">
customerId
</th>
<th field="companyName" data-options="sortable:true" width="50">
companyName
</th>
<th field="phone" width="50">
phone
</th>
<th field="address" width="50">
address
</th>
</tr>
</thead>
</table>
<div id="toolbar">
<div>
<a class="easyui-linkbutton" iconcls="icon-add" onclick="add();">新增</a>
<a class="easyui-linkbutton" iconcls="icon-edit" onclick="edit();">修改</a>
<a class="easyui-linkbutton" iconcls="icon-remove" onclick="del();">刪除</a>
</div>
<div>
<input id="queryBox" class="easyui-textbox" buttonicon="icon-search" style="width: 200px;"
data-options="onClickButton:function(){loadList(loadListSettings);}" />
<a class="easyui-linkbutton" iconcls="icon-find" onclick="showQueryWindow();">
詳細查詢</a>
</div>
</div>
<script type="text/javascript">
var loadListSettings = { searchFields: "customerId,companyName", prompt: "請輸入客戶Id或公司名稱" };
</script>
<script type="text/javascript">
pageInit(); 
</script>

為了這樣簡潔的前臺,我們需要準備:

1、通用的佈局模板_Layout.cshtml。base.css、base.js、defaultSettings.js、tool.js和private.js見後面


<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<link href='/webResource/easyui/themes/default/easyui.css' rel='stylesheet' type='text/css' />
<link href='/webResource/easyui/themes/icon.css' rel='stylesheet' type='text/css' />
<link href='/webResource/base.css' rel='stylesheet' type='text/css' />
<script src="/webResource/jquery/jquery.min.js" type="text/javascript"></script>
<script src="/webResource/jquery/json2.js" type="text/javascript"></script>
<script src="/webResource/easyui/jquery.easyui.min.js" type="text/javascript"></script>
<script src="/webResource/easyui/locale/easyui-lang-zh_CN.js" type="text/javascript"></script>
<script src="/webResource/tool.js" type="text/javascript"></script>
<script src="/webResource/base.js" type="text/javascript"></script>
<script src="/webResource/defaultSettings.js" type="text/javascript"></script>
<script src="/webResource/private.js" type="text/javascript"></script>
@RenderSection("scripts", required: false)
</head>
<body style="width: 100%; height: 100%; margin: 0px;">
@RenderBody()
</body>
</html>

2、平臺樣式表base.css


.icon-find
{
background: url('icons/find.png') no-repeat center center;
}
.datagrid-toolbar div:nth-child(1)
{
float: left;
width: 60%;
}
.datagrid-toolbar div:nth-child(2)
{
margin-left: 60%;
margin-right: 10px;
width: auto;
text-align: right;
}

3、基本方法指令碼base.js


//取消自動渲染
$.parser.auto = false;
function pageInit() {
//改變控制元件預設值
$.fn.linkbutton.defaults.plain = true;
$.fn.datagrid.defaults.fit = true;
$.fn.datagrid.defaults.fitColumns = true;
$.fn.datagrid.defaults.pagination = true;
//顯示ajax異常資訊
$(document).ajaxError(function (event, xhr, options, exc) {
$.messager.alert({ title: '非同步請求出錯', msg: xhr.responseText, icon: "error" });
});
//位址列傳參允許中文
jQuery(document).ajaxSend(function (event, request, options) {
options.url = encodeURI(options.url);
});
$.parser.parse();
}
function loadList(settings) {
var settings = $.extend(true, {}, loadListDefaultSettings, settings);
if ($("#"   settings.gridId).length == 0)
$.messager.alert({ title: "系統異常", msg: "DataGrid:"   settings.gridId   "不存在!", icon: "error" });
var quickQueryData = [];
if ($("#"   settings.queryBoxId).length > 0) {
var val = $("#"   settings.queryBoxId).textbox("getValue");
if (settings.searchFields && val) {
var keys = settings.searchFields.split(',');
for (i = 0, len = keys.length; i < len; i  ) {
quickQueryData.push({ field: keys[i], method: 'inLike', value: val });
}
}
}
var queryData = []; //詳細查詢預留 
//載入資料
$("#"   settings.gridId).datagrid("load", { quickQueryData: JSON.stringify(quickQueryData), queryData: JSON.stringify(queryData) });
}

4、基本指令碼預設值defaultSettings.js


//查詢引數設定
var loadListDefaultSettings = {
url: "getList",
gridId: "dataGrid",
queryWindowId: "queryWindow",
queryBoxId: "queryBox",
searchFields: "Name",
addQueryString: true,
prompt: "請輸入"
};
5、可能需要使用的工具方法tool.js
//判斷是否包含位址列引數
function hasQueryString(key, url) {
if (typeof (url) == "undefined")
url = window.location.search;
var re = new RegExp("[?&]"   key   "=([^\\&]*)", "i");
var a = re.exec(url);
if (a == null) return false;
return true;
}
//獲取位址列引數,如果引數不存在則返回空字串
function getQueryString(key, url) {
if (typeof (url) == "undefined")
url = window.location.search;
var re = new RegExp("[?&]"   key   "=([^\\&]*)", "i");
var a = re.exec(url);
if (a == null) return "";
return a[1];
}
//將當前位址列引數加入到url
function addUrlSearch(url) {
var newParams = [];
var paramKeys = window.location.search.replace('?', '').split('&');
for (var i = 0; i < paramKeys.length; i  ) {
var key = paramKeys[i].split('=')[0];
if (key == "" || key == "_t" || key == "_winid" || key == "isTab")
continue;
if (!hasQueryString(key, url))
newParams.push(paramKeys[i]);
}
if (url.indexOf('?') >= 0)
return url   "&"   newParams.join('&');
else
return url   "?"   newParams.join('&');
}
//url增加引數
function addSearch(url, key, value) {
if (!hasQueryString(key, url)) {
if (url.indexOf('?') >= 0)
return url   "&"   key   "="   value;
else
return url   "?"   key   "="   value;
}
else
return url;
}
//獲取陣列中物件的某個值,逗號分隔
function getValues(rows, attr) {
var fieldValues = [];
for (var i = 0; i < rows.length; i  ) {
if (rows[i] != null)
fieldValues.push(rows[i][attr]);
}
return fieldValues.join(',');
}

6、可能需要使用的私有方法private.js,此檔案包含的方法專供base.js使用,開發web時禁止使用


//替換掉Url中的{}引數
function replaceUrl(settings, pty) {
if (!pty)
pty = "url";
if (!settings[pty])
return;
var str = settings[pty];
var guid = "";
var result = str.replace(/\{[0-9a-zA-Z_]*\}/g, function (e) {
var key = e.substring(1, e.length - 1);
if (key == "GUID") {
if (!guid) {
$.ajax({
url: "getGuid",
type: "post",
async: false,
success: function (text, textStatus) {
guid = text;
}
});
}
return guid;
}
if (hasQueryString(key)) //從位址列返回
return getQueryString(key);
if (settings.currentRow && settings.currentRow[key])//從當前行返回
return settings.currentRow[key];
if (settings.paramFrom) { //從指定控制元件返回
var ctrl = mini.get(settings.paramFrom);
if (ctrl == undefined) {
$.messager.alert({ title: 'UI出錯', msg: "Id為"   settings.paramFrom   "的控制元件不存在!", icon: "error" });  
return;
}
else if (ctrl.showCheckBox) {
return getValues(ctrl.getCheckedNodes(), key);
}
else if (ctrl.getSelecteds)
return getValues(ctrl.getSelecteds(), key);
else if (ctrl.getValue)
return ctrl.getValue();
}
return e;
});
settings[pty] = result;
return result;
}
//轉化為全路徑
function changeToFullUrl(settings) {
var url = settings.url;
if (url.indexOf('/') == 0 || url.indexOf("http://") == 0 || url.indexOf('?') == 0 || url == "")
return url;
currentUrlPathName = window.location.pathname;
var currentPathNameParts = currentUrlPathName.split('/');
var pathNameParts = url.split('?')[0].split('/');
if (currentPathNameParts[currentPathNameParts.length - 1] == "")
currentPathNameParts.pop(); //去掉一個反斜線
if (pathNameParts[pathNameParts.length - 1] == "")
pathNameParts.pop(); //去掉一個反斜線
var index = currentPathNameParts.length - 1;
for (var i = 0; i < pathNameParts.length; i  ) {
if (pathNameParts[i] == "..") {
index = index - 1;
if (index <= 0) {
$.messager.alert({ title: "系統異常", msg: "Url錯誤:"   url   "!", icon: "error" });
return;
}
continue;
}
if (index < currentPathNameParts.length)
currentPathNameParts[index] = pathNameParts[i];
else
currentPathNameParts.push(pathNameParts[i]);
index = index   1;
}
var length = currentPathNameParts.length;
for (var i = index; i < length; i  ) {
currentPathNameParts.pop();
}
var result = currentPathNameParts.join('/');
if (url.indexOf('?') > 0)
result  = url.substring(url.indexOf('?'));
settings.url = result;
}

我們期望簡潔的後臺程式碼,如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using formula;
using System.Data;
namespace demo.Areas.basic.Controllers
{
public class customerController : BaseController
{
public JsonResult getList(QueryBuilder qb)
{
SqlHelper sqlHelper = new SqlHelper("demo");
var data = sqlHelper.ExecuteGridData("select *,id=customerId from customer", qb);
return Json(data);
}
}
}

為了這種簡潔的程式碼我們需要:

1、Controller基類BaseController:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Data.Entity.Validation;
using System.ComponentModel;
using System.Reflection;
using System.Web.Security;
using formula;
namespace formula
{
public abstract class BaseController : Controller
{
#region 處理不存在的Action
protected override void HandleUnknownAction(string actionName)
{
if (Request.HttpMethod == "POST")
{
HttpContext.ClearError();
HttpContext.Response.Clear();
HttpContext.Response.StatusCode = 500;
HttpContext.Response.Write("沒有Action:"   actionName);
HttpContext.Response.End();
}
// 搜尋檔案是否存在
var filePath = "";
if (RouteData.DataTokens["area"] != null)
filePath = string.Format("~/Areas/{2}/Views/{1}/{0}.cshtml", actionName, RouteData.Values["controller"], RouteData.DataTokens["area"]);
else
filePath = string.Format("~/Views/{1}/{0}.cshtml", actionName, RouteData.Values["controller"]);
if (System.IO.File.Exists(Server.MapPath(filePath)))
{
View(filePath).ExecuteResult(ControllerContext);
}
else
{
HttpContext.ClearError();
HttpContext.Response.Clear();
HttpContext.Response.StatusCode = 500;
HttpContext.Response.Write("沒有Action:"   actionName);
HttpContext.Response.End();
}
}
#endregion
#region 基類Json方法過載
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
NewtonJsonResult result = new NewtonJsonResult() { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior };
return result;
}
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding)
{
NewtonJsonResult result = new NewtonJsonResult() { Data = data, ContentType = contentType, ContentEncoding = contentEncoding };
return result;
}
#endregion
#region 異常處理
protected override void OnException(ExceptionContext filterContext)
{
Exception exp = filterContext.Exception;
if (string.IsNullOrEmpty(exp.Message))
exp = exp.GetBaseException();
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
var response = filterContext.RequestContext.HttpContext.Response;
response.Clear();
response.Write(exp.Message);
response.StatusCode = 500;
response.End();
}
}
#endregion
}
}

2、查詢構造器QueryBuilder:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Web.Mvc;
namespace formula
{
[ModelBinder(typeof(QueryBuilderBinder))]
public class QueryBuilder : SearchCondition
{
public int page { get; set; }
public int rows { get; set; }
public string sort { get; set; }
public string order { get; set; }
public int total { get; set; }
public string getOrderByString(bool hasOrderBy = true)
{
var sortFields = this.sort.Split(',');
var sortOrders = this.order.Split(',');
string str = "";
for (int i = 0; i < sortFields.Length; i  )
{
str  = sortFields[i]   " "   sortOrders[i]   ",";
}
if (hasOrderBy && str != "")
str = "order by "   str;
return str.Trim(',');
}
}
public class SearchCondition
{
public string fields = "*";
private List<ConditionItem> quickItems = new List<ConditionItem>();
private List<ConditionItem> complexItems = new List<ConditionItem>();
public SearchCondition add(string field, string method, object val, bool isQuickSearch = false)
{
//處理日期型資料
if (method == "<" || method == "<=")
{
if (val.GetType() == typeof(DateTime))
{
DateTime t = (DateTime)val;
val = t.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
}
}
ConditionItem item = new ConditionItem(field, method, val);
if (isQuickSearch)
quickItems.Add(item);
else
complexItems.Add(item);
return this;
}
public string getWhereString(bool hasWhere = true)
{
if (quickItems.Count == 0 && complexItems.Count == 0)
return "";
string strWhere = "";
if (quickItems.Count > 0)
strWhere  = " and ("   getGourpWhereString(quickItems, true)   ")";
if (complexItems.Count > 0)
strWhere  = " and ("   getGourpWhereString(complexItems, false)   ")";
if (hasWhere)
strWhere = " where "   strWhere.Substring(4);
else
strWhere = " and "   strWhere.Substring(4);
return strWhere;
}
#region 私有方法
private string getGourpWhereString(List<ConditionItem> list, bool isOrRelation = false)
{
if (list.Count == 0)
return "";
string strWhere = "";
for (int i = 0; i < list.Count(); i  )
{
var item = list[i];
string str = item.getWhereString();
if (isOrRelation)
{
strWhere  = " or "   str;
}
else
{
strWhere  = " and "   str;
}
}
strWhere = strWhere.Substring(4);
return strWhere;
}
#endregion
}
public class ConditionItem
{
public ConditionItem(string field, string method, object val)
{
this.field = field;
this.method = method;
this.value = val;
}
public string field { get; set; }
public string method { get; set; }
public object value { get; set; }
public string getWhereString()
{
var item = this;
switch (item.method)
{
case "=":
case "<":
case ">":
case "<=":
case ">=":
case "<>":
return string.Format("{0} {1} '{2}'", item.field, item.method, item.value);
case "in":
string v = "";
if (item.value is ICollection)
{
ICollection<string> collection = item.value as ICollection<string>;
v = string.Join("','", collection.ToArray<string>());
return string.Format("{0} in('{1}')", item.field, v);
}
else
{
v = item.value.ToString().Replace(",", "','");
}
return string.Format("{0} in ('{1}')", item.field, v);
case "between":
object[] objs = item.value as object[];
return string.Format("{0} between '{1}' and '{2}'", item.field, objs[0], objs[1]);
case "inLike":
string[] arr = null;
if (item.value is ICollection)
{
ICollection<string> collection = item.value as ICollection<string>;
arr = collection.ToArray<string>();
}
else
{
arr = item.value.ToString().Split(',', ',');
}
string str = "";
foreach (string s in arr)
{
str  = string.Format("or {0} like '%{1}%'", item.field, s);
}
return "("   str.Substring(3)   ")";
case "day":
DateTime dt = DateTime.Now;
if (!DateTime.TryParse(item.value.ToString(), out dt))
{
throw new BuessinessException("查詢條件不能轉化為日期時間");
}
string start = dt.Date.ToString("yyyy-MM-dd");
string end = dt.Date.AddDays(1).ToString("yyyy-MM-dd");
return string.Format("{0} between '{1}' and '{2}'", item.field, start, end);
case "startWith":
return string.Format("{0} like '{1}%'", item.field, item.value);
case "endWith":
return string.Format("{0} like '%{1}'", item.field, item.value);
default:
return "";
}
}
}
}

3、查詢構造器QueryBuilder的建立方法QueryBuilderBinder:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
namespace formula
{
public class QueryBuilderBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var qb = (QueryBuilder)(bindingContext.Model ?? new QueryBuilder());
var dict = controllerContext.HttpContext.Request.Params;
var quickQueryList = !string.IsNullOrEmpty(dict["quickQueryData"]) ? JsonHelper.ToList(dict["quickQueryData"]) : new List<Dictionary<string, object>>();
var queryList = !string.IsNullOrEmpty(dict["queryData"]) ? JsonHelper.ToList(dict["queryData"]) : new List<Dictionary<string, object>>();
foreach (var dic in quickQueryList)
{
var val = dic["value"].ToString();
if (val == "") continue;
qb.add(dic["field"].ToString(), dic["method"].ToString(), val, true);
}
foreach (var dic in queryList)
{
var val = dic["value"].ToString();
if (val == "") continue;
qb.add(dic["field"].ToString(), dic["method"].ToString(), val, false);
} 
qb.page = !string.IsNullOrEmpty(dict["page"]) ? int.Parse(dict["page"].ToString()) : 1;
qb.rows = !string.IsNullOrEmpty(dict["rows"]) ? int.Parse(dict["rows"].ToString()) : 10;
qb.sort = !string.IsNullOrEmpty(dict["sort"]) ? dict["page"].ToString() : "id";
qb.order = !string.IsNullOrEmpty(dict["order"]) ? dict["order"].ToString() : "desc";
return qb;
}
}
}

4、資料庫查詢幫助類SqlHelper:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Web;
namespace formula
{
public class SqlHelper
{
#region 建構函式
public SqlHelper(string connName)
{
if (System.Configuration.ConfigurationManager.ConnectionStrings[connName] == null)
throw new BuessinessException(string.Format("配置檔案中不包含資料庫連線字串:{0}", connName));
this.connName = connName;
this.connString = System.Configuration.ConfigurationManager.ConnectionStrings[connName].ConnectionString;
}
public string connName { get; private set; }
public string connString { get; private set; }
public string dbName
{
get
{
SqlConnection conn = new SqlConnection(connString);
return conn.Database;
}
}
#endregion
#region 基本方法
public object ExecuteScalar(string cmdText)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(cmdText, conn);
return cmd.ExecuteScalar();  
}
}
public DataTable ExecuteDataTable(string cmdText)
{
using (SqlConnection conn = new SqlConnection(connString))
{
DataTable dt = new DataTable();
SqlDataAdapter apt = new SqlDataAdapter(cmdText, conn);
apt.Fill(dt);
return dt;
}
}
public DataTable ExecuteDataTable(string cmdText, int start, int len)
{
using (SqlConnection conn = new SqlConnection(connString))
{
DataTable dt = new DataTable();
SqlDataAdapter apt = new SqlDataAdapter(cmdText, conn);
apt.Fill(start, len, dt);
return dt;
}
}
public string ExecuteNonQuery(string cmdText)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(cmdText, conn);
return cmd.ExecuteNonQuery().ToString();
}
}
#endregion
#region 支援查詢物件
public DataTable ExecuteDataTable(string sql, SearchCondition cnd, string orderBy)
{
string sqlWhere = " where 1=1"   GetUrlFilterSqlWhere(sql)   cnd.getWhereString(false);
sql = string.Format("select {0} from ({1}) sourceTable {2} {3}", cnd.fields, sql, sqlWhere, orderBy);
DataTable dt = this.ExecuteDataTable(sql);
return dt;
}
public Dictionary<string, object> ExecuteGridData(string sql, QueryBuilder qb)
{
string sqlWhere = " where 1=1"   GetUrlFilterSqlWhere(sql)   qb.getWhereString(false);
qb.total = (int)this.ExecuteScalar(string.Format("select count(1) from ({0}) sourceTable {1}", sql, sqlWhere));
sql = string.Format("select {0} from ({1}) sourceTable {2} {3}", qb.fields, sql, sqlWhere, qb.getOrderByString());
DataTable dt = ExecuteDataTable(sql, (qb.page - 1) * qb.rows, qb.rows);
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("total", qb.total);
dic.Add("rows", dt);  
return dic;
}
#endregion
#region 私有方法
private string GetUrlFilterSqlWhere(string sql)
{
sql = string.Format("select * from({0}) as dt1 where 1=2", sql);
var dtField = ExecuteDataTable(sql);
StringBuilder sb = new StringBuilder();
foreach (string key in HttpContext.Current.Request.QueryString.Keys)
{
if (string.IsNullOrEmpty(key) || key.ToLower() == "id")
continue;
if (dtField.Columns.Contains(key))
{
string value = HttpContext.Current.Server.UrlDecode(HttpContext.Current.Request[key]);
value = value.Replace(",", "','");
sb.AppendFormat(" and {0} in ('{1}')", key, value);
}
}
return sb.ToString();
}
#endregion
}
}

5、用於取代返回值JsonResult的NewtonJsonResult:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web;
using System.Data;
namespace formula
{
public class NewtonJsonResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
//確認是否用於響應HTTP-Get請求
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
string.Compare(context.HttpContext.Request.HttpMethod, "GET", true) == 0)
{
throw new InvalidOperationException("禁止Get請求");
}
HttpResponseBase response = context.HttpContext.Response;
//設定媒體型別和編碼方式
response.ContentType = string.IsNullOrEmpty(this.ContentType) ?
"application/json" : this.ContentType;
if (this.ContentEncoding != null)
{
response.ContentEncoding = this.ContentEncoding;
}
//序列化物件,並寫入當前的HttpResponse
if (null == this.Data) return;
if (this.Data is string)
{
response.Write(Data);
}
else if (this.Data is DataRow)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
DataRow row = this.Data as DataRow;
foreach (DataColumn col in row.Table.Columns)
{
dic.Add(col.ColumnName, row[col]);
}
response.Write(JsonHelper.ToJson(dic));
}
else
{
response.Write(JsonHelper.ToJson(this.Data));
}
}
}
}

6、Json序列化和反序列的幫助類JsonHelper:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
namespace formula
{
public static class JsonHelper
{
public static string ToJson<T>(T obj)
{
if (obj == null || obj.ToString() == "null") return null;
if (obj != null && (obj.GetType() == typeof(String) || obj.GetType() == typeof(string)))
{
return obj.ToString();
}
IsoDateTimeConverter dt = new IsoDateTimeConverter();
dt.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss";
return JsonConvert.SerializeObject(obj, dt);
}
/// <summary> 
/// 從一個Json串生成物件資訊 
/// </summary> 
/// <param name="jsonString">JSON字串</param> 
/// <typeparam name="T">物件型別</typeparam>  
/// <returns></returns> 
public static T ToObject<T>(string json) where T : class
{
if (String.IsNullOrEmpty(json)) return null;
T obj = JsonConvert.DeserializeObject<T>(json);
return obj;
}
/// <summary>
/// 返回 Diction<string,object>
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static Dictionary<string, object> ToObject(string json)
{
if (String.IsNullOrEmpty(json)) return new Dictionary<string, object>();
return ToObject<Dictionary<string, object>>(json);
}
/// <summary>
/// 返回 List<Dictionary<string, object>>
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static List<Dictionary<string, object>> ToList(string json)
{
if (String.IsNullOrEmpty(json)) return new List<Dictionary<string, object>>();
return ToObject<List<Dictionary<string, object>>>(json);
}
/// <summary>
/// 組裝物件
/// </summary>
/// <param name="json"></param>
/// <param name="obj"></param>
public static void PopulateObject(string json, object obj)
{
if (String.IsNullOrEmpty(json)) return;
JsonConvert.PopulateObject(json, obj);
}
}
}

7、用於區分系統異常和業務異常的BusinessException:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace formula
{
/// <summary>
/// 業務異常
/// </summary> 
[Serializable]
public class BuessinessException : Exception
{
/// <summary>
/// 系統異常建構函式
/// </summary>
public BuessinessException()
{
}
/// <summary>
/// 系統異常建構函式
/// </summary>
/// <param name="message">異常的訊息</param>
public BuessinessException(string message)
: base(message)
{
}
/// <summary>
/// 系統異常建構函式
/// </summary>
/// <param name="message">異常的訊息</param>
/// <param name="inner">內部的異常</param>
public BuessinessException(string message, System.Exception inner)
: base(message, inner)
{
}
/// <summary>
/// 系統異常建構函式
/// </summary>
/// <param name="info">存有有關所引發異常的序列化的物件資料</param>
/// <param name="context">包含有關源或目標的上下文資訊</param>
public BuessinessException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
}

最後,上程式碼:http://xiazai.jb51.net/201604/yuanma/ASP.NET-MVC-EasyUI-sampleFrame%28jb51.net%29.rar

您可能感興趣的文章:

asp.net mvc 從資料庫中讀取圖片的實現程式碼asp.net mvc4 mysql製作簡單分頁元件(部分檢視)使用jQuery向asp.net Mvc傳遞複雜json資料-ModelBinder篇ASP.NET MVC DropDownList資料繫結及使用詳解ASP.NET中MVC從後臺控制器傳遞資料到前臺檢視的方式Asp.net mvc 資料呼叫示例程式碼ASP.NET MVC 資料驗證及相關內容ASP.NET Mvc開發之刪除修改資料ASP.NET中MVC傳遞資料的幾種形式總結ASP.NET Mvc開發之查詢資料JQuery對ASP.NET MVC資料進行更新刪除asp.net實現的MVC跨資料庫多表聯合動態條件查詢功能示例ASP.NET MVC使用EPPlus,匯出資料到Excel中

相關文章

前端開發 最新文章