一步一步搭框架(asp.netmvc+easyui+sqlserver)-03

一步一步搭框架(asp.netmvc+easyui+sqlserver)-03

我们期望简洁的后台代码,如下:

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
    }

}
View Code


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 "";
            }



        }
    }
}
View Code


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;

        }
    }
}
View Code

 

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

    }
}
View Code

 

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));
            }
        }
    }

}
View Code

 

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);
        }
    }
}
View Code

 

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)
        {

        }
    }
}
View Code

 

以上为目前的全部代码。

转载于:https://www.cnblogs.com/sampleFrame/p/5402824.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值