using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Data;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using System.Threading;
using FineUIPro;
using AspNet = System.Web.UI.WebControls;
namespace FineUIPro.Web
{
public class PageBase : System.Web.UI.Page
{
///
/// 当前登录人信息。
///
public Model.Sys_User CurrUser
{
get
{
if (Session["CurrUser"] == null) return null;
return (Model.Sys_User)Session["CurrUser"];
}
}
#region OnInit
protected override void OnInit(EventArgs e)
{
var pm = PageManager.Instance;
if (pm != null)
{
HttpCookie themeCookie = Request.Cookies["Theme_Pro"];
if (themeCookie != null)
{
string themeValue = themeCookie.Value;
// 是否为内置主题
if (IsSystemTheme(themeValue))
{
pm.CustomTheme = String.Empty;
pm.Theme = (Theme)Enum.Parse(typeof(Theme), themeValue, true);
}
else
{
pm.CustomTheme = themeValue;
}
}
}
HttpCookie langCookie = Request.Cookies["Language_Pro"];
if (langCookie != null)
{
string langValue = langCookie.Value;
try
{
// 是否为内置语言
pm.Language = (Language)Enum.Parse(typeof(Language), langValue, true);
}
catch (Exception)
{
pm.CustomLanguage = langValue;
}
}
HttpCookie modeCookie = Request.Cookies["MenuMode_Pro"];
if (modeCookie != null)
{
string modeType = modeCookie.Value;
if (modeType == "compact")
{
pm.EnableCompactMode = true;
}
else if (modeType == "large")
{
pm.EnableLargeMode = true;
}
}
HttpCookie loadingCookie = Request.Cookies["Loading_Pro"];
if (loadingCookie != null)
{
int loadingNumber = Convert.ToInt32(loadingCookie.Value);
pm.LoadingImageNumber = loadingNumber;
}
// 为所有页面添加公共的:
System.Web.UI.HtmlControls.HtmlGenericControl metaCtrl = new System.Web.UI.HtmlControls.HtmlGenericControl("meta");
metaCtrl.Attributes["http-equiv"] = "Content-Type";
metaCtrl.Attributes["content"] = "text/html; charset=utf-8";
Header.Controls.AddAt(0, metaCtrl);
// 为所有页面添加公共的:
System.Web.UI.HtmlControls.HtmlGenericControl linkCtrl = new System.Web.UI.HtmlControls.HtmlGenericControl("link");
linkCtrl.Attributes["rel"] = "stylesheet";
linkCtrl.Attributes["type"] = "text/css";
linkCtrl.Attributes["href"] = ResolveClientUrl("~/res/css/common.css");
Header.Controls.Add(linkCtrl);
this.Load += new EventHandler(this.PageBase_Load);
this.Unload += new EventHandler(this.PageBase_UNLoad);
base.OnInit(e);
}
private bool IsSystemTheme(string themeName)
{
themeName = themeName.ToLower();
string[] themes = Enum.GetNames(typeof(Theme));
foreach (string theme in themes)
{
if (theme.ToLower() == themeName)
{
return true;
}
}
return false;
}
///
/// 页面登录成功
///
///
///
protected void PageBase_Load(object sender, EventArgs e)
{
//这是后置式的权限管理策略.
//页面装载完成以后才检查是否有权限打开此页....
//anyway,its ok.
this.Title = BLL.Funs.SystemName;
if (CurrUser == null)
{
if (this.Page.Request.AppRelativeCurrentExecutionFilePath != "~/Login.aspx")
Response.Redirect("~/Login.aspx");
}
}
///
/// UNLOAD事件,发生在页面装载顺序的最后。
/// 在这里处理的是DBLIST,数据库连接字典。
///
/// S
/// E
protected void PageBase_UNLoad(object sender, EventArgs e)
{
if (BLL.Funs.DBList.ContainsKey(System.Threading.Thread.CurrentThread.ManagedThreadId))
{
BLL.Funs.DBList.Remove(System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}
#endregion
///
/// 语言国际化
///
protected override void InitializeCulture()
{
string https = ConfigurationManager.AppSettings["Https"];
if (Request.Cookies["SelectLan"] != null)
{
HttpCookie lanCookie = Request.Cookies["SelectLan"];
//从Session或Cookie里面读取
string language = lanCookie["lan"];
//当前线程的语言采用哪种语言(比如zh,en等)
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
//决定各种数据类型是如何组织,如数字与日期
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(language);
}
else
{
HttpCookie lanCookie = new HttpCookie("SelectLan");
//默认为中文
lanCookie["lan"] = "zh-CN";
lanCookie.Expires = DateTime.Now.AddDays(1);
if (https == "true")
{
lanCookie.Secure = true;
}
Response.Cookies.Add(lanCookie);
}
}
///
/// 获取语言
///
public string GetLanguage
{
get
{
string lan = "zh-CN";
if (Request.Cookies["SelectLan"] != null)
{
HttpCookie lanCookie = Request.Cookies["SelectLan"];
if (lanCookie["lan"] != null)
{
if (lanCookie["lan"] == "en-US")
{
lan = "en-US";
}
}
}
return lan;
}
}
///
/// 最外层FRAME跳转到新地址
///
/// URL
public static void ZXRefresh(string urlstr)
{
System.Web.HttpContext.Current.Response.Write("");
System.Web.HttpContext.Current.Response.End();
}
#region 将IEnumerable类型的集合转换为DataTable类型
///
/// 将IEnumerable类型的集合转换为DataTable类型
///
///
///
///
protected DataTable LINQToDataTable(IEnumerable varlist)
{ //定义要返回的DataTable对象
DataTable dtReturn = new DataTable();
// 保存列集合的属性信息数组
PropertyInfo[] oProps = null;
if (varlist == null) return dtReturn;//安全性检查
//循环遍历集合,使用反射获取类型的属性信息
foreach (T rec in varlist)
{
//使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
//循环PropertyInfo数组
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType;//得到属性的类型
//如果属性为泛型类型
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
== typeof(Nullable<>)))
{ //获取泛型类型的参数
colType = colType.GetGenericArguments()[0];
}
//将类型的属性名称与属性类型作为DataTable的列数据
dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
}
//新建一个用于添加到DataTable中的DataRow对象
DataRow dr = dtReturn.NewRow();
//循环遍历属性集合
foreach (PropertyInfo pi in oProps)
{ //为DataRow中的指定列赋值
dr[pi.Name] = pi.GetValue(rec, null) == null ?
DBNull.Value : pi.GetValue(rec, null);
}
//将具有结果值的DataRow添加到DataTable集合中
dtReturn.Rows.Add(dr);
}
return dtReturn;//返回DataTable对象
}
#endregion
#region 模拟数据库分页及排序,两种方式,一种传入数据表,另一种传入泛型
///
/// 模拟数据库分页
///
/// IEnumerable类型
/// Grid表格
/// IEnumerable类型的集合
/// 数据表
protected DataTable GetPagedDataTable(FineUIPro.Grid Grid1, IEnumerable varlist)
{
int pageIndex = Grid1.PageIndex;
int pageSize = Grid1.PageSize;
string sortField = Grid1.SortField;
string sortDirection = Grid1.SortDirection;
DataTable tb = this.LINQToDataTable(varlist);
DataView view = tb.DefaultView;
if (view.Count > 0)
{
view.Sort = String.Format("{0} {1}", sortField, sortDirection);
}
DataTable table = view.ToTable();
DataTable paged = table.Clone();
int rowbegin = pageIndex * pageSize;
int rowend = (pageIndex + 1) * pageSize;
if (rowend > table.Rows.Count)
{
rowend = table.Rows.Count;
}
for (int i = rowbegin; i < rowend; i++)
{
paged.ImportRow(table.Rows[i]);
}
return paged;
}
///
/// 模拟数据库分页
///
/// Grid表格
/// 数据表
/// 数据表
protected DataTable GetPagedDataTable(FineUIPro.Grid Grid1, DataTable tb)
{
int pageIndex = Grid1.PageIndex;
int pageSize = Grid1.PageSize;
string sortField = Grid1.SortField;
string sortDirection = Grid1.SortDirection;
//DataTable table2 = DataSourceUtil.GetDataTable2();
DataView view = tb.DefaultView;
// view.Sort = String.Format("{0} {1}", sortField, sortDirection);
if (!string.IsNullOrEmpty(sortField) && view.Count > 0)
{
view.Sort = String.Format("{0} {1}", sortField, sortDirection);
}
DataTable table = view.ToTable();
DataTable paged = table.Clone();
int rowbegin = pageIndex * pageSize;
int rowend = (pageIndex + 1) * pageSize;
if (rowend > table.Rows.Count)
{
rowend = table.Rows.Count;
}
for (int i = rowbegin; i < rowend; i++)
{
paged.ImportRow(table.Rows[i]);
}
return paged;
}
#endregion
#region 表格过滤
// 表格过滤
protected DataTable GetFilteredTable(JArray filteredData, DataTable source)
{
DataTable result = source.Clone();
foreach (DataRow row in source.Rows)
{
bool filtered = true;
foreach (JObject filteredObj in filteredData)
{
if (row != null && !CheckDataRow(row, filteredObj))
{
filtered = false;
break;
}
}
if (filtered)
{
result.Rows.Add(row.ItemArray);
}
}
return result;
}
private bool CheckDataRow(DataRow row, JObject filteredObj)
{
// 在 ASPX 中设置列的 ColumnID 属性,约定 ColumnID 和数据库的字段名称一样
string columnID = filteredObj.Value("column");
object rowitemData = row[columnID];
bool multi = filteredObj.Value("multi");
if (multi)
{
string matcher = filteredObj.Value("matcher");
JArray items = filteredObj.Value("items");
bool valid = false;
if (matcher == "all")
{
valid = true;
}
foreach (JObject item in items)
{
string itemOperator = item.Value("operator");
object itemValue = item.Value