MVC+easyui 完整实现
学习mvc半月有余,趁几天假期,没事做就动手做一个完整的网站玩玩,顺便和上家公司的方法做个比较。页面引擎采用mvc自带的功能,建立视图,交给.net自带渲染出页面(对比:上家公司采用的第三方组件渲染的);前台和后台通过ajax方式交互(对比:基于ashx+配置文件,采用反射来实现,比较繁琐);orm采用自带的EF6(对比:采用Dbcommand封装,datatable和model之间采用反射实现自动绑定,不支持add一个对象,比较低端),吸取上家大牛的方法,可自定义数据库配置,比如定义sql以及使用什么数据库,只是使用起来比较蹩脚,大牛勿喷;页面模板之前使用template.js,现在尝试了razor语法。功能:权限部分基本实现完整,后续有时间继续完善了。通过此次实践:积累一些心得是,很多看似简单的东西,如果动手起来,还是有不少细节去注意,这期间可能就是一种体验,一种经验的积累,各种滋味只有自己尝试了才会有所获。
环境:vs2015+ sql server 2008+ EF6+ easyui.备注是支持MySQL的,采用EF,稍微封装了一下。
权限控制,MVC下真的很方便,可控制页面菜单,可控制操作级别的,点赞。下面是抄袭网上的。
public class AuthorizeManageAttribute : AuthorizeAttribute
{
private int _a, _b;
private bool yes;
public AuthorizeManageAttribute(int a, int b)
{
_a = a;
_b = b;
}
//首先被执行的方法
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
yes = _a > _b;
return yes;
}
//尽在authorizecore方法返回false时执行
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
else
{
filterContext.HttpContext.Response.Redirect("/HtmlPage1.html");
}
}
}
EF,一个蹩脚的封装:
namespace FrameWrok.Common
{
internal class DataCommandContext<TContext> where TContext :DbContext,new()
{
public void Dispose()
{ } public static TContext GetContext()
{
return new TContext();
}
}
} public class DataCommand<TContext> where TContext : DbContext, new()
{
private readonly string _cmdKey;
private readonly string _server;
private IDictionary<string, SqlCmdModel> _dictCmd = new Dictionary<string, SqlCmdModel>(); /// <summary>
/// xml中,sqlcmd 的name属性
/// </summary>
public string CmdKey
{
get
{
return _cmdKey;
}
}
/// <summary>
/// 数据库类型:支持sql server
/// </summary>
public string Server
{
get
{
return _server;
}
} /// <summary>
/// 当前sql语句
/// </summary>
public string CurCmdLine => _dictCmd.Keys.Any() == false ? string.Empty : _dictCmd[_cmdKey].CmdLine; public DataCommand() { }
public DataCommand(string server, string sqlCmdName)
{
_server = server;
_cmdKey = sqlCmdName;
ReadCmmdConfig();
}
/// <summary>
/// sql语句参数,采用简单的字符串替换,因此在sql字符串中不能用重复的关键字出现(对比:采用setparameter更加严谨)
/// </summary>
/// <param name="param"></param>
/// <param name="val"></param>
public void SetParameters(string param, string val)
{
if(_dictCmd.Keys.Any()==false) throw new SqlNotFilledException();
var targetCmd = _dictCmd[_cmdKey].CmdLine;
_dictCmd[_cmdKey].CmdLine = targetCmd.Replace(param, val);
}
/// <summary>
/// 自定义sql
/// </summary>
/// <typeparam name="T">根据输出的sql字段定义类</typeparam>
/// <returns>可以返回null</returns>
public List<T> ExecuteSql<T>()
{
if (string.IsNullOrEmpty(CurCmdLine)) return null;
using (var db = DataCommandContext<TContext>.GetContext())
{
var sql = CurCmdLine;
var res = db.Database.SqlQuery<T>(sql).ToList();
return res;
}
}
public void ExecuteNoReturn()
{
if (string.IsNullOrEmpty(CurCmdLine)) return ;
using (var db = DataCommandContext<TContext>.GetContext())
{
var sql = CurCmdLine;
db.Database.ExecuteSqlCommand(sql);
}
}
/// <summary>
/// 添加基本表内容
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static bool Add<T>(T obj) where T:class
{
using (var db = DataCommandContext<TContext>.GetContext())
{
db.Entry(obj).State=EntityState.Added;
db.SaveChanges();
return true;
}
}
public static DbContext GetCurContext()
{
return DataCommandContext<TContext>.GetContext();
}
private void ReadCmmdConfig()
{
var dir=new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory+"config");
if(dir==null) throw new InvalidOperationException();
var fileList=dir.GetFiles("*.xml");
foreach (var fileInfo in fileList)
{
ParseXml(fileInfo.FullName);
if (_dictCmd.Keys.Count > 0) return;
}
} private void ParseXml(string path)
{
SqlRoot root;
using (var stream = new StreamReader(path))
{
var xmlSeri = new XmlSerializer(typeof(SqlRoot));
root = (SqlRoot)xmlSeri.Deserialize(stream);
}
if (!root.SqlCmdList.Any()) throw new SqlNullValueException();
var serverFound =root.SqlCmdList.Where(x => x.Name.Equals(_server)).ToList();
if(!serverFound.Any()) throw new SqlNullValueException();
var cmdFound = serverFound[0].SqlCmd.Where(x => x.Name.Equals(_cmdKey)).ToList();
if(!cmdFound.Any()) throw new SqlNotFilledException();
_dictCmd.Add(_cmdKey,cmdFound[0]);
}
} [XmlRoot("SqlRoot")]
public class SqlRoot
{
[XmlElement("SqlList")]
public List<SqlList> SqlCmdList;
}
[XmlRoot("SqlList")]
public class SqlList
{
[XmlAttribute("name")]
public string Name { get; set; } [XmlElement("SqlCmd")]
public List<SqlCmdModel> SqlCmd { get; set; }
}
[XmlRoot("SqlCmd")]
public class SqlCmdModel
{
[XmlElement("param")]
public List<Params> Param { get; set; }
[XmlElement("CmdLine")]
public string CmdLine { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
}
[XmlRoot]
public class Params
{
[XmlAttribute("name")]
public string Name { get; set;}
[XmlAttribute("type")]
public string Type { get; set; }
}
当你想自定义sql,不想使用linq to sql时,可以在配置文件中定义结构,将获取的sql传递EF执行,xml结构:
<?xml version="1.0" encoding="utf-8" ?>
<SqlRoot>
<SqlList name="sqlServer">
<SqlCmd name="DeleteRolesById">
<CmdLine>
<![CDATA[
delete from tb_usergroup where id in(@roles)
]]>
</CmdLine>
<param name="@roles" type="string"/>
</SqlCmd>
<SqlCmd name="DeleteUserById">
<CmdLine>
<![CDATA[
delete from tb_user where id in(@roles)
]]>
</CmdLine>
<param name="@roles" type="string"/>
</SqlCmd>
<SqlCmd name="GetBlogAll">
<CmdLine>
<![CDATA[
select * from blogs --where blogid=@BlogId
]]>
</CmdLine>
</SqlCmd> <SqlCmd name="GetBlogTitle">
<CmdLine>
<![CDATA[
select p.PostId, p.Title,b.Name from Posts p
left join Blogs b on p.BlogId=b.BlogId ]]>
</CmdLine>
</SqlCmd>
</SqlList>
<SqlList name="mySql"> </SqlList>
<SqlList name="oracle">
</SqlList>
</SqlRoot>
之前没做过mvc,使用公司封装的框架,但是通过一路做下来,查资料,很多原理或者基本是相通的,从页面渲染处理,前端和后端交互,后台权限控制方法、orm数据层,采用mvc似乎更加方便,mvc只是多了个路由功能,可怜那帮小伙伴还在被蹂躏中。
MVC+easyui 完整实现的更多相关文章
- MVC+EasyUI 菜单导航的实现
一个简单的使用mvc+easyUi 动态菜单显示 直接上代码 前端 function initMenu() { $.get("/Admin/Home/GetNav", functi ...
- ASP.NET MVC+EasyUI+Entity FrameWork 整合开发
本文详细讲解怎么用ASP.NET MVC+EasyUI+Entity FrameWork 来开发一个项目 对于ASP.NET MVC的Jscript库,主要引用 <script type=.mi ...
- ASP.NET MVC +EasyUI 权限设计(二)环境搭建
请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...
- ASP.NET MVC +EasyUI 权限设计(一)开篇
在前一段时间中,老魏的确非常的忙碌,Blog基本上没有更新了,非常的抱歉,那么在后面的时间中,老魏会尽量的抽时间来写的,可能时间上就不太富裕了.今天开始呢,老魏会和大家分享一下关于权限设计的有关文章, ...
- 对Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架的个人认识
对Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架的个人认识 初次接触Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架,查阅了相 ...
- hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结
最近刚开始接触hibernate+spring+mvc+Easyui框架,也是刚开通了博客,希望能记录一下自己实践出来的东西,让其他人少走弯路. 转让正题,以个人浅薄的认识hibernate对于开发人 ...
- Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架
Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架 初次接触Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架,查阅了相关资料,了解了框 ...
- asp.net mvc +easyui 实现权限管理(二)
一写完后,好久没有继续写了.最近公司又在重新开发权限系统了,但是由于我人微言轻,无法阻止他们设计一个太监版的权限系统.想想确实是官大一级压死人啊, 没办法我只好不参与了 让他们去折腾. 我就大概说一下 ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(四)—— session传递登录人信息显示+用户注销
前面的学习,已经做好了简单的登录和主页,涉及了三层软件架构,mvc,easyui的layout.tree.tab.window,sqlite,动软代码自动生成. 下面完善一下登录跳转主页后,在sout ...
随机推荐
- Android中使用gzip传递数据
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时 ...
- Codeforces 444 C. DZY Loves Colors (线段树+剪枝)
题目链接:http://codeforces.com/contest/444/problem/C 给定一个长度为n的序列,初始时ai=i,vali=0(1≤i≤n).有两种操作: 将区间[L,R]的值 ...
- IIS 7 WAS服务不可用
在 Windows Server 2008 上使用 %windir%\system32\inetsrv\appcmd.exe list wp 命令,得到如下错误: ERROR ( message:WA ...
- hdoj 5399 Tpp simple
WA了一下午.... 1WA:T了,因为阶乘没打表所以时间超了.. 2WA,3WA:runtime error,检查的value数组开小了,应该是MAXN.. 4WA.5WA.6WA:改了改对cnt的 ...
- Linux下的Crontab应用
crontab是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: /sbin/servic ...
- angular实践第一弹:选项卡开发
在学习angular的过程中,实践是最好的方法. 在开发选项卡的过程中,不需要再像jquery一样以DOM操作为核心,那什么样的情况是以DOM操作为核心的Jquery的思想呢? 一想到改变什么,就想设 ...
- Mahout之深入navie Bayesian classifier理论
转自:http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html 1.1.摘要 贝叶斯分类是一类分 ...
- IPv4&IPv6双重协议栈
IPV4 TCP客户与IPV6服务器之间的通信: 1 启动IPV6服务器,创建套接监听口,绑定通配地址 2 IPV4调用gethostbyname找到该服务器对应的A记录 3 调用connect,向服 ...
- Ext.form.ComboBox 后台取值 动态加载 ext5.0.0
我用的extjs是5.0.0版本的. 请注意:如果这里没有的combobox相关内容,这里一定有. 开始的时候keyup事件取到的数据就是放不到ComboBox中,放全局变量也不好用.最后大神出手帮忙 ...
- 数据库相关文章转载(1) MySQL性能优化之参数配置
1.目的: 通过根据服务器目前状况,修改Mysql的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能. 2.服务器参数: 32G内存.4个CPU,每个CPU 8核. 3.MySQL目 ...