学习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 完整实现的更多相关文章

  1. MVC+EasyUI 菜单导航的实现

    一个简单的使用mvc+easyUi 动态菜单显示 直接上代码 前端 function initMenu() { $.get("/Admin/Home/GetNav", functi ...

  2. ASP.NET MVC+EasyUI+Entity FrameWork 整合开发

    本文详细讲解怎么用ASP.NET MVC+EasyUI+Entity FrameWork 来开发一个项目 对于ASP.NET MVC的Jscript库,主要引用 <script type=.mi ...

  3. ASP.NET MVC +EasyUI 权限设计(二)环境搭建

    请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...

  4. ASP.NET MVC +EasyUI 权限设计(一)开篇

    在前一段时间中,老魏的确非常的忙碌,Blog基本上没有更新了,非常的抱歉,那么在后面的时间中,老魏会尽量的抽时间来写的,可能时间上就不太富裕了.今天开始呢,老魏会和大家分享一下关于权限设计的有关文章, ...

  5. 对Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架的个人认识

    对Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架的个人认识   初次接触Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架,查阅了相 ...

  6. hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结

    最近刚开始接触hibernate+spring+mvc+Easyui框架,也是刚开通了博客,希望能记录一下自己实践出来的东西,让其他人少走弯路. 转让正题,以个人浅薄的认识hibernate对于开发人 ...

  7. Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架

    Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架 初次接触Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架,查阅了相关资料,了解了框 ...

  8. asp.net mvc +easyui 实现权限管理(二)

    一写完后,好久没有继续写了.最近公司又在重新开发权限系统了,但是由于我人微言轻,无法阻止他们设计一个太监版的权限系统.想想确实是官大一级压死人啊, 没办法我只好不参与了 让他们去折腾. 我就大概说一下 ...

  9. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(四)—— session传递登录人信息显示+用户注销

    前面的学习,已经做好了简单的登录和主页,涉及了三层软件架构,mvc,easyui的layout.tree.tab.window,sqlite,动软代码自动生成. 下面完善一下登录跳转主页后,在sout ...

随机推荐

  1. KMP应用http://acm.hdu.edu.cn/showproblem.php?pid=2594

    riemann与marjorie拼接后riemannmarjorie前缀与后缀公共部分为 rie 长度为 3(即next[l] = next[14]的值,l为拼接后的长度)但:aaaa与aa拼接后aa ...

  2. [转]Android在初始化时弹出popwindow的方法 .

    转自:http://blog.csdn.net/sxsboat/article/details/7340759 留个人备用0.0 Android中在onCreate()时弹出popwindow,很多人 ...

  3. HDU 4497 GCD and LCM (数学,质数分解)

    题意:给定G,L,分别是三个数最大公因数和最小公倍数,问你能找出多少对. 析:数学题,当时就想错了,就没找出规律,思路是这样的. 首先G和L有公因数,就是G,所以就可以用L除以G,然后只要找从1-(n ...

  4. effective c++ (二)

    条款04:确定对象使用前已先被初始化 1.由于 c part of c++而且初始化可能导致运行期成本,那么就不保证发生初始化:例如arry是c part of c++的部分从而不能保证初始化,而ST ...

  5. javascript js 内存泄露

    JavaScript 内存泄露 1.什么是闭包.以及闭包所涉及的作用域链这里就不说了. 2.JavaScript垃圾回收机制 JavaScript不需要手动地释放内存,它使用一种自动垃圾回收机制(ga ...

  6. C:结构体

    结构体 构造类型:就是有基本的类型组成的 1.结构体  结构体是一种自定义的数据类型 和 int float 是一样的都可以定义变量 数组 只能存放一种类型的容器 结构体   可以存放多种数据类型  ...

  7. JavaScript 不重复的随机数

    在 JavaScript 中,一般产生的随机数会重复,但是有时我们需要不重复的随机数,如何实现?本文给于解决方法,需要的朋友可以参考下     在 JavaScript 中,一般产生的随机数会重复,但 ...

  8. VS2010开发环境最佳字体及配色[转]

    从地址:http://www.dev-club.net/xiangxixinxi/42010072906150537/201103010518006.html 获取的,整理如下: 环境:VS2010字 ...

  9. <创建和销毁对象>经验法则——考虑用静态工厂方法代替公有构造方法

    一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多 ...

  10. XHTML标签的嵌套规则--很基础很重要

    XHTML的标签有许多:div.ul.li.dl.dt.dd.h1~h6.p.a.addressa.span. strong……我们在运用这些标签搭建页面结构的时候,是可以将它们无限嵌套的,但是,嵌套 ...