利用ASP.NET MVC+EasyUI+SqlServer搭建企業(yè)開發(fā)框架
我們要搭建的框架是企業(yè)級(jí)開發(fā)框架,適用用企業(yè)管理信息系統(tǒng)的開發(fā),如:OA、HR等
1、框架名稱:sampleFrame。
2、搭建原則:最少知識(shí)原則。
3、先定義一個(gè)簡單的編碼規(guī)范:除類名和接口名外,其余首字母小寫。
4、準(zhǔn)備開發(fā)環(huán)境:vs2010及以上(mvc4)、sqlserver、jquery2.0和easyui1.4.5
首先來看一下列表頁面的效果圖:
我們期望簡潔帶前臺(tái)代碼,如下:
<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();"> 詳細(xì)查詢</a> </div> </div> <script type="text/javascript"> var loadListSettings = { searchFields: "customerId,companyName", prompt: "請(qǐng)輸入客戶Id或公司名稱" }; </script> <script type="text/javascript"> pageInit(); </script>
為了這樣簡潔的前臺(tái),我們需要準(zhǔn)備:
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、平臺(tái)樣式表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
//取消自動(dòng)渲染 $.parser.auto = false; function pageInit() { //改變控件默認(rèn)值 $.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: '異步請(qǐng)求出錯(cuò)', 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: "系統(tǒng)異常", 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 = []; //詳細(xì)查詢預(yù)留 //加載數(shù)據(jù) $("#" + settings.gridId).datagrid("load", { quickQueryData: JSON.stringify(quickQueryData), queryData: JSON.stringify(queryData) }); }
4、基本腳本默認(rèn)值defaultSettings.js
//查詢參數(shù)設(shè)置 var loadListDefaultSettings = { url: "getList", gridId: "dataGrid", queryWindowId: "queryWindow", queryBoxId: "queryBox", searchFields: "Name", addQueryString: true, prompt: "請(qǐng)輸入" }; 5、可能需要使用的工具方法tool.js //判斷是否包含地址欄參數(shù) 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; } //獲取地址欄參數(shù),如果參數(shù)不存在則返回空字符串 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]; } //將當(dāng)前地址欄參數(shù)加入到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增加參數(shù) 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; } //獲取數(shù)組中對(duì)象的某個(gè)值,逗號(hào)分隔 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使用,開發(fā)web時(shí)禁止使用
//替換掉Url中的{}參數(shù) 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])//從當(dāng)前行返回 return settings.currentRow[key]; if (settings.paramFrom) { //從指定控件返回 var ctrl = mini.get(settings.paramFrom); if (ctrl == undefined) { $.messager.alert({ title: 'UI出錯(cuò)', 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; } //轉(zhuǎn)化為全路徑 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(); //去掉一個(gè)反斜線 if (pathNameParts[pathNameParts.length - 1] == "") pathNameParts.pop(); //去掉一個(gè)反斜線 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: "系統(tǒng)異常", msg: "Url錯(cuò)誤:" + 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; }
我們期望簡潔的后臺(tái)代碼,如下:
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、查詢構(gòu)造器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) { //處理日期型數(shù)據(jù) 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("查詢條件不能轉(zhuǎn)化為日期時(shí)間"); } 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、查詢構(gòu)造器QueryBuilder的創(chuàng)建方法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、數(shù)據(jù)庫查詢幫助類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 構(gòu)造函數(shù) public SqlHelper(string connName) { if (System.Configuration.ConfigurationManager.ConnectionStrings[connName] == null) throw new BuessinessException(string.Format("配置文件中不包含數(shù)據(jù)庫連接字符串:{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 支持查詢對(duì)象 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) { //確認(rèn)是否用于響應(yīng)HTTP-Get請(qǐng)求 if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Compare(context.HttpContext.Request.HttpMethod, "GET", true) == 0) { throw new InvalidOperationException("禁止Get請(qǐng)求"); } HttpResponseBase response = context.HttpContext.Response; //設(shè)置媒體類型和編碼方式 response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType; if (this.ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding; } //序列化對(duì)象,并寫入當(dāng)前的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> /// 從一個(gè)Json串生成對(duì)象信息 /// </summary> /// <param name="jsonString">JSON字符串</param> /// <typeparam name="T">對(duì)象類型</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> /// 組裝對(duì)象 /// </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、用于區(qū)分系統(tǒng)異常和業(yè)務(wù)異常的BusinessException:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace formula { /// <summary> /// 業(yè)務(wù)異常 /// </summary> [Serializable] public class BuessinessException : Exception { /// <summary> /// 系統(tǒng)異常構(gòu)造函數(shù) /// </summary> public BuessinessException() { } /// <summary> /// 系統(tǒng)異常構(gòu)造函數(shù) /// </summary> /// <param name="message">異常的消息</param> public BuessinessException(string message) : base(message) { } /// <summary> /// 系統(tǒng)異常構(gòu)造函數(shù) /// </summary> /// <param name="message">異常的消息</param> /// <param name="inner">內(nèi)部的異常</param> public BuessinessException(string message, System.Exception inner) : base(message, inner) { } /// <summary> /// 系統(tǒng)異常構(gòu)造函數(shù) /// </summary> /// <param name="info">存有有關(guān)所引發(fā)異常的序列化的對(duì)象數(shù)據(jù)</param> /// <param name="context">包含有關(guān)源或目標(biāo)的上下文信息</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 從數(shù)據(jù)庫中讀取圖片的實(shí)現(xiàn)代碼
- asp.net mvc4 mysql制作簡單分頁組件(部分視圖)
- 使用jQuery向asp.net Mvc傳遞復(fù)雜json數(shù)據(jù)-ModelBinder篇
- ASP.NET MVC DropDownList數(shù)據(jù)綁定及使用詳解
- ASP.NET中MVC從后臺(tái)控制器傳遞數(shù)據(jù)到前臺(tái)視圖的方式
- Asp.net mvc 數(shù)據(jù)調(diào)用示例代碼
- ASP.NET MVC 數(shù)據(jù)驗(yàn)證及相關(guān)內(nèi)容
- ASP.NET Mvc開發(fā)之刪除修改數(shù)據(jù)
- ASP.NET中MVC傳遞數(shù)據(jù)的幾種形式總結(jié)
- ASP.NET Mvc開發(fā)之查詢數(shù)據(jù)
- JQuery對(duì)ASP.NET MVC數(shù)據(jù)進(jìn)行更新刪除
- asp.net實(shí)現(xiàn)的MVC跨數(shù)據(jù)庫多表聯(lián)合動(dòng)態(tài)條件查詢功能示例
- ASP.NET MVC使用EPPlus,導(dǎo)出數(shù)據(jù)到Excel中
相關(guān)文章
asp.net core webapi 服務(wù)端配置跨域的實(shí)例
下面小編就為大家分享一篇asp.net core webapi 服務(wù)端配置跨域的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12ASP.NET MVC 開發(fā)微信支付H5的實(shí)現(xiàn)示例(外置瀏覽器支付)
這篇文章主要介紹了ASP.NET MVC 開發(fā)微信支付H5的實(shí)現(xiàn)示例(外置瀏覽器支付),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可
ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可...2006-09-09ASP.NET通過第三方網(wǎng)站Bitly實(shí)現(xiàn)短鏈接地址程序
這篇文章主要介紹了ASP.NET通過第三方網(wǎng)站Bitly實(shí)現(xiàn)短鏈接地址程序的步驟,需要的朋友可以參考下。2016-06-06.NET?Core類庫項(xiàng)目中讀取appsettings.json配置的方法
ASP.NET?Core是一個(gè)全新的Web開發(fā)平臺(tái),微軟在它上面構(gòu)建了MVC、SingalR、GRPC、Orleans這樣廣泛使用的Web框架,今天通過本文給大家詳細(xì)介紹下.NET?Core讀取appsettings.json配置的方法,感興趣的朋友一起看看吧2022-03-03使用ASP.NET一般處理程序或WebService返回JSON的實(shí)現(xiàn)代碼
今天, 將為大家說明如何在 ASP.NET 中使用一般處理程序或者 WebService 向 javascript 返回 JSON2011-10-10Web.config 和 App.config 的區(qū)別分析
Web.config 和 App.config 的區(qū)別分析,需要的朋友可以參考一下2013-05-05