学习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. WinHTTP Web Proxy Auto-Discovery Service

    下面是网上搜集的,个人没有做测试,----------------------------- WinHTTP Web Proxy Auto-Discovery Service 服务成功发送一个 开始 ...

  2. 关于诺顿身份安全2013独立版(Norton Identity Safe)

    现在身份安全这货好像从诺顿的套装当中独立出来了,出了中文版.其实诺顿的Web信誉做得还是不错的,当然天朝不要有太大期望.只是公认的做web信誉做得最好的应该就是趋势科技和诺顿,所以诺顿的身份安全也许还 ...

  3. HDU 1160 FatMouse's Speed (sort + dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 给你一些老鼠的体重和速度,问你最多需要几只可以证明体重越重速度越慢,并输出任意一组答案. 结构体 ...

  4. HDU4513吉哥系列故事――完美队形II(manacher算法)

    这个比最长回文子串就多了一个条件,就是回文字串(这里相当于人的高度)由两端向中间递增. 才刚刚看了看manacher,在用模板A了一道题后,还没有完全理解manacher,然后就准备把这道题也直接带模 ...

  5. java使用jdbc对sqlite 添加、删除、修改的操作

    package com.jb.jubmis.Dao.DaoImpl; import java.io.File;import java.io.FileInputStream;import java.io ...

  6. linux内核完全注释之微型计算机组成结构

    计算机组成原理 1.传统计算机计算机组成框图 CPU通过地址线.数据线.控制线组成的本地总线(或内部总线),与系统的其他部分进行数据通信,地址线用于提供内存或I/O设备的地址,指明所需读写数据的具体操 ...

  7. 使用Canvas把照片转换成素描画

    原文:http://www.alloyteam.com/2012/07/convert-picture-to-sketch-by-canvas/ 腾讯的alloy team写的一个素描效果,挺不错的. ...

  8. NLog使用总结

    一.代码调用方式:    public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); Logger .Trac ...

  9. PHP函数前面的@。

    @是可以屏蔽函数执行过程中遇到问题而产生的一些错误.警告信息,这样用户就看不到程序的出错信息.这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息. 比如说这个: for($ ...

  10. Js制作点击输入框时默认文字消失的效果

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-02-17) 为了提高用户体验和易用度,一些设计师会对网页中用户经常用的东西进行优化,比如输入框.一般的输入框是怎样优化的呢 ...