时间:2021-07-01 10:21:17 帮助过:2人阅读
为了这种简洁的代码我们需要:
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);
}
}
}