EasyUI+MVC+EF简单用户管理Demo(问题及解决)
写在前面
关于EasyUI了解差不多,就想结合MVC、EF做一个简单的用户管理Demo,其实没多少东西,但这是小菜我第一次做。主要是熟悉下其中的流程,当然也遇到一些问题,走了很多的弯路。
Demo做的过程就不详细描述了,大家可以在文章后面下载下来看下,这边就只记录下在做的过程中遇到的一些问题和解决方式,希望可以帮到像我一样的小菜,也欢迎大神指点。
自己动手,丰衣足食。
iframe-src
Easyui左边菜单链接到内容区域的tab,tab页面一般用的是iframe,在ASP.NET我们一般使用下面这样的src:
<iframe scrolling="auto" frameborder="0" src="Home.html" style="width:100%;height:100%;"></iframe>
在MVC中如果直接使用这样的src链接会找不到页面地址,我们需要这样做:
<iframe scrolling="auto" frameborder="0" src="Home/GetView?viewPara=Home" style="width:100%;height:100%;"></iframe>
src格式是“{controller}/{action}?viewPara={ViewName}”,控制器代码:
/// <summary>
/// iframe获取视图
/// </summary>
/// <returns></returns>
public ActionResult GetView(string viewPara)
{
return View(viewPara);
}
如果填写的ViewName不是在本目录下,要填写相对目录比如:src="Home/GetView?viewPara=../User/User_List“。
EntityFramework版本
关于这个问题,这边我要详细的描述下,虽然最后解决方式很简单,但是在找出这个问题的时候花了我好几个小时,很是郁闷。
MVC我们提交表单一般是用Aajx,如下登陆提交表单检查账号:
$.ajax({
url: "Login/CheckUserLogin",
type: "POST",
dataType: "json",
data: { "Name": $("#UserName").val(), "Password": $("#Password").val() },
//contentType: "application/json",
success: function (data) {
if (data.result == "success") {
window.location.href = "/Home/Index";
}
else {
alert(data.content);
window.location.href = "/Login/Login/";
}
},
error: function (xhr, error, ex) {
alert("出现错误,请稍后再试,带来不便,敬请谅解");
window.location.href = "/Login/Login/";
}
});
可以看出js代码没什么问题,从URL看出是提交到Login控制器的CheckUserLogin,那我们代码可以这样写:
/// <summary>
/// 处理登录的信息
/// </summary>
/// <param name="userInfo"></param>
/// <returns></returns>
public JsonResult CheckUserLogin(UserInfo userInfo)
{
//return Json(new { result = "error", content = "用户名密码错误,请您检查" });
using (EasyUIDemoDBEntities db = new EasyUIDemoDBEntities())
{
//linq查询
var users = from p in db.UserInfo
where p.Name == userInfo.Name && p.Password == userInfo.Password && p.Enable == true
select p;
if (users.Count() > )
{
userInfo = users.FirstOrDefault();
Response.Cookies["UserName"].Value = userInfo.Name;
Response.Cookies["UserName"].Expires = DateTime.Now.AddDays();
return Json(new { result = "success", content = "" });
}
else
{
return Json(new { result = "error", content = "用户名密码错误,请您检查" });
}
}
}
EasyUIDemoDBEntities是我们创建模型的上下文,从代码上可以看出也没什么问题,那我们在第十行设置个断点,运行一下:

上面报的是“Internal Server Error”错误,我们上面在CheckUserLogin方法中设置的断点根本没有执行到,网上找了很多的资料,但是没有没能找到方式解决,我原本以为是Ajax提交问题,然后改成Get提交,把using里的代码屏蔽掉是可以的,那就说明Ajax没什么问题。
回到“Internal Server Error”这段话,从字面上理解是主机服务器问题,网上说是后台代码问题,当时没怎么注意,心想没什么问题啊,最后实在找不到其他原因,就新建一个控制台程序,把using里面的代码复制过去,运行一下,报下面错误:

从上面调试的结果看出,我们离真相越来越近了,也说明一点:不要太相信自己的代码。从异常上可以看出是EntityFramework版本问题。


第一个是控制台程序的EntityFramework版本,第二个是实例模型的EntityFramework版本,因为我们创建控制台程序的时候,NuGget添加程序包EntityFramework是添加的最新版本,而新建实体模型的时候,添加的是4.4版本,我们把EntityFramework版本修改一致就可以了。
connectionStrings
上面的问题解决了,我们就可以调试代码了,但是下面又出现这样的问题:

异常表示找不到EasyUIDemoDBEntities连接字符串,但是我们创建的实体模型App.Config文件中是有EasyUIDemoDBEntities连接字符串的,网上搜了一下,说是要在主程序也要加连接字符串,MVC添加EasyUIDemoDBEntities连接字符串后,运行OK。
View、Action、页面跳转
解决完iframe的src有关后,我们现在要这样做:登录输入用户名和密码,如果正确的话跳转到主界面,关于MVC中js跳转页面我们可以这样写:
//window.location.href = "Home/GetView?viewPara=Index";
//window.location.href = "@Url.Content("/Home/Index/")";
window.location.href = "/Home/Index";
Home表示Controller,Index表示Action,主界面的src还是按照我们上面解决方式写,跳转到主界面会出现下面这种情况:

我们如果改下路由直接浏览主界面,是可以正常浏览的,但是从上面可以看出iframe的src根本没有执行到Home控制器,网上也没搜到相关资料,最后在Home控制器添加下面代码就好了:
public ActionResult Home()
{
return View();
}
不知是什么情况?再做个试验:我们再主界面的主页这样写:
<iframe scrolling="auto" frameborder="0" src="Home/GetView?viewPara=../User/User_Add" style="width:100%;height:100%;"></iframe>
src不指向Home,而指向User目录下的User_Add,Home控制器代码:
public ActionResult Index()
{
return View();
}
public ActionResult Home()
{
return View();
}
/// <summary>
/// iframe获取视图
/// </summary>
/// <returns></returns>
public ActionResult GetView(string viewPara)
{
return View(viewPara);
}
在三个Action中分别设置断点,从登录页面跳转到主界面会发现,Index和Home执行到了,但是正常应该是执行Index和GetView,因为我们没有写任何关于Home链接的代码,如果我们直接进入的是主界面,会发现Index和GetView是执行到的,从上面可能明白一些,但是又好像不明白,这个有待研究。
除了主界面加载的时候home链接问题,还有就是菜单点击iframe问题,解决方法就是每个页面写一个Action。
EasyUI中DataGrid绑定
easyui中使用datagrid绑定数据大家做的时候可能也用到过,主要是按照一定的json格式输出就行了,这是我第一次做,遇到下面问题,花了很多时间:
/// <summary>
/// 获取用户的所有信息
/// </summary>
/// <returns></returns>
public ActionResult GetAllUserInfo()
{
int pageIndex = Request["page"] == null ? : int.Parse(Request["page"]);
int pageSize = Request["rows"] == null ? : int.Parse(Request["rows"]); using (EasyUIDemoDBEntities db = new EasyUIDemoDBEntities())
{
var data = from u in db.UserInfo
select new { u.ID, u.Name, u.Phone, u.Password, u.Mail, u.CreateTime, u.Address, u.Enable };
var result = new { total = data.Count(), rows = data };
return Json(result, JsonRequestBehavior.AllowGet);
}
return Json(datajson);
}
前端代码:
$(function () {
//初始化弹出窗体
initTable();
});
//初始化表格
function initTable() {
$('#test').datagrid({
title: '用户列表',
iconCls: 'icon-user',
loadMsg: '数据加载中...',
nowrap: true,
autoRowHeight: true,
striped: true,
url: '/User/GetAllUserInfo',
sortName: 'ID',
sortOrder: 'asc',
border: true,
remoteSort: false,
idField: 'ID',
pageSize:10,
pagination: true,
rownumbers: true,
columns: [[
{ field: 'ck', checkbox: true },
{ field: 'ID', title: 'ID', width: 50, sortable: true },
{ field: 'Name', title: '用户名', width: 100, sortable: true },
{ field: 'Phone', title: "电话", width: 150, sortable: true },
{ field: 'Password', title: "密码", width: 150, sortable: true },
{ field: 'Mail', title: "EMail", width: 150, sortable: true },
{
field: 'CreateTime', title: "添加时间", width: 150, sortable: true,
formatter: function (value, row, index) {
//return (eval(value.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"))).pattern("yyyy-M-d h:m:s");
}
},
{ field: 'Address', title: "地址", width: 250, sortable: true },
{
title: '是否启用', field: 'Enable', width: 80, formatter: function (val, rowdata, index) {
if (val) {
return '<a class="grid_Enable" href="javascript:void(0)" >' + val + '</a>';
} else {
return '<a class="grid_unEnable" href="javascript:void(0)" >' + val + '</a>';
}
}
}
]],
onLoadSuccess: function () {
$(".grid_Enable").linkbutton({ text: '启用', plain: true, iconCls: 'icon-ok' });
$(".grid_unEnable").linkbutton({ text: '禁止', plain: true, iconCls: 'icon-stop' });
},
});
}
前端代码没什么问题,大家使用easyui绑定数据也是这么使用的,但是如果按照上面的代码是显示不出数据,最后找到原因是var result格式问题,修改一下代码如下:
using (EasyUIDemoDBEntities db = new EasyUIDemoDBEntities())
{
var temp = from u in db.UserInfo select u;
total = temp.Count();
var users = temp.OrderByDescending(s => s.ID)
.Skip<UserInfo>((pageIndex - ) * pageSize).Take<UserInfo>(pageSize);
List<UserInfo> list = new List<UserInfo>();
foreach (UserInfo item in users)
{
list.Add(item);
}
var data1 = new
{
total = total,
rows = list
};
return Json(data1);
}
或者是修改rows = users.ToList<UserInfo>();隐式类型转化成泛型,其实说到底就是自己知识的不足,关于隐式类型和泛型,以及Json()方法的使用,虽然找到问题及解决方式,但是深层次的原因还是不清楚,可以查询绑定的完整代码:
/// <summary>
/// 获取用户的所有信息
/// </summary>
/// <returns></returns>
public ActionResult GetAllUserInfo()
{
int pageIndex = Request["page"] == null ? : int.Parse(Request["page"]);
int pageSize = Request["rows"] == null ? : int.Parse(Request["rows"]);
int total = ;
using (EasyUIDemoDBEntities db = new EasyUIDemoDBEntities())
{
var temp = from u in db.UserInfo select u;
total = temp.Count();
var users = temp.OrderByDescending(s => s.ID)
.Skip<UserInfo>((pageIndex - ) * pageSize).Take<UserInfo>(pageSize);
var data = new
{
total = total,
rows = users.ToList<UserInfo>()
};
return Json(data);
}
}
效果:

新增、修改和删除数据
这个简单示例服务端就只有一个上下文,下面以新增为例,修改删除都是类似操作,下载来看可以看下完整代码,新增用户操作前端代码:
@*添加用户弹窗*@
<div id="AddUserDialog" class="easyui-dialog" style="width:360px;height:310px;padding:10px 20px"
closed="true" resizable="true" modal="true" buttons="#dlg-buttons" align="center">
<form id="ff" method="post" novalidate="novalidate">
<table id="tblAdd">
<tr>
<td><label for="Name">用户名:</label></td>
<td><input class="easyui-validatebox" type="text" id="Name" name="Name" data-options="required:true,validType:'length[1,32]'" /></td>
</tr>
<tr>
<td><label for="Password">密码:</label></td>
<td><input class="easyui-validatebox" type="text" id="Password" name="Password" data-options="required:true,validType:'length[1,32]'" /></td>
</tr>
<tr>
<td><label for="PasswordOK">确认密码:</label></td>
<td><input class="easyui-validatebox" type="text" id="PasswordOK" name="PasswordOK" data-options="required:true" validType="equalTo['Password']" invalidMessage="两次输入密码不匹配" /></td>
</tr>
<tr>
<td><label for="Phone">电话:</label></td>
<td><input class="easyui-numberbox" type="text" id="Phone" name="Phone" data-options="validType:'length[1,14]'" /></td>
</tr>
<tr>
<td><label for="Mail">邮箱:</label></td>
<td><input class="easyui-validatebox" type="text" id="Mail" name="Mail" data-options="required:true,validType:'email'" /></td>
</tr>
<tr>
<td><label for="Address">地址:</label></td>
<td><textarea id="Address" name="Address" style="height:50px;"></textarea></td>
</tr>
<tr>
<td><label for="Enable">启用:</label></td>
<td><select id="Enable" name="Enable" class="easyui-combobox" panelHeight='auto'>
<option value="1">启用</option>
<option value="0">禁止</option>
</select>
</td>
</tr>
<tr>
<td colspan="2" style="text-align:center; padding-top:10px">
<a href="javascript:void(0)" class="easyui-linkbutton" id="btnAddUser" iconcls="icon-ok" >确定</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-cancel" onclick="javascript:$('#AddUserDialog').dialog('close')">关闭</a>
</td>
</tr>
</table>
</form>
</div>
js代码:
//添加用户对话框
function AddUserDialog() {
$('#AddUserDialog').dialog('open').dialog('setTitle', '添加用户');
ClearText();
}
//添加用户添加事件
function BindAddUserClickEvent() {
$("#btnAddUser").click(function () {
//验证所有的文本框是否通过用户的验证
var valid = $('#ff').form('validate');
if (valid == false) {
return false;
}
var CBEnable = true;
if ($("#Enable").combobox('getValue')=="0") {
CBEnable = false;
} //创建传递的参数
var postdata = {
Name: $("#Name").val(),
Password: $("#Password").val(),
Mail: $("#Mail").val(),
Phone: $("#Phone").val(),
Address: $("#Address").val(),
Enable: CBEnable
}; //发送异步请求到后台保存用户数据
$.post("/User/AddUser", postdata, function (data) {
if (data == "OK") {
alert("添加成功");
$('#AddUserDialog').dialog('close');
$("#test").datagrid("reload");
}
else {
alert("添加失败,请您检查");
}
});
});
}
控制器代码:
/// <summary>
/// 添加用户
/// </summary>
/// <param name="userinfo"></param>
/// <returns></returns>
public ActionResult AddUser(UserInfo userinfo)
{
userinfo.CreateTime = DateTime.Now;
using (EasyUIDemoDBEntities db = new EasyUIDemoDBEntities())
{
db.UserInfo.Add(userinfo);
db.SaveChanges();
}
return Content("OK");
}
可以看到前端的AddUserDialog是一个添加用户弹窗,这里面主要注意的是一些easyui控件的取值或赋值操作,比如combobox的取值为:$("#Enable1").combobox('getValue');赋值为:$('#Enable').combobox('setValue', '1');这些都是一些小操作,用的时间长慢慢就会了。可以看到easyui使用起来还是蛮方便的,可能js脚本需要写东西,但是页面布局就很简单。控制器那边只有一个上下文操作,没有任何封装,对于像小菜一样的我们是个福利,毕竟路是一点一点走出来的。
效果图、完整示例Demo下载


完整示例Demo下载:http://pan.baidu.com/s/1i3kMyzV
后记
上面的示例Demo可能对很多人来说很简单,但是如果你自己一点一滴的去完成它,你会发现会有很多的东西要去学习,有时候会眼高手低的去做一些事情,但反过头来确实高看了自己。当然这个Demo还有很多问题要去完善,现在还在学习中,与你共勉。
如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^
EasyUI参考示例教程:
EasyUI+MVC+EF简单用户管理Demo(问题及解决)的更多相关文章
- spring boot一个简单用户管理DEMO
概述 该Demo旨在部署一个简单spring boot工程,包含数据编辑和查看功能 POM配置 <?xml version="1.0" encoding="UTF- ...
- vue入门:用户管理demo
该demo纯前端实现 使用到vue技术点: 1.在该demo中使用到的vue指令:{{}}. v-if. v-model. @click v-for 2.在该demo中使用到的事件修饰符: .prev ...
- 基于vue.js的简单用户管理
功能描述:添加.修改.搜索过滤 效果图: <!DOCTYPE html> <html lang="en"> <head> <title&g ...
- 用标准Struts2+mvc写的用户管理
这星期的实验,最终调好了. 一句话,麻雀虽小,五脏俱全.相信刚学struts2的同学能够通过该实验能够更好地理解struts的结构和mvc 登录的之前写过,这里直接进入用户管理 用struts2都要在 ...
- EasyUI +MVC +EF实现增删改查
OA项目的框架已经搭建好了,接下来就是在这个框架下完成相应的业务的编码,接下来实现UserInfo页面的增删改查. 1.首先先谈一下遇到的一个框架上的问题:提示EF版本不一致之类的问题,主要是解决方案 ...
- centos 简单用户管理
一.配置文件 /etc/passwd:存放用户信息,以“:”分割成7个部分 1.账号名称,用来对应UID: 2.早期密码存放位置,后来密码改存/etc/shadow中,以“x”代替: 3.UID,使用 ...
- ceph简单用户管理
列出所有用户 ceph auth list 获取指定用户 ceph auth get client.admin 新增用户并输出密钥环 ceph auth get-or-create client.ge ...
- Nodejs+Express+Mysql实现简单用户管理增删改查
源码地址 https://github.com/king-y/NodeJs/tree/master/user 目录结构 mysql.js var mysql = require('mysql'); v ...
- [转]Spring3 MVC + jQuery easyUI 做的ajax版本用户管理
原文地址:http://www.iteye.com/topic/1081739 上周写了篇基于spring3.0.5 mvc 简单用户管理实例 ( http://www.iteye.com/topic ...
随机推荐
- 编写base64图片文件
base64编码代替css背景图片在网站上应用是很广泛的,例如:loading gif图片,天猫加载时那只猫等等. 因为base64图片可以减少http请求,所以我们经常会把不经常改动的,独立的,尺寸 ...
- 紫書_例5-10 UVa207
細節較多,自己寫的第一份半殘品,未能AC,后參考了劉老師的代碼,寫出了第二份的代碼,經過多次修改后總算AC,然而後果也很嚴重,導致代碼和劉老師極其相似,這也是我不喜歡看了參考代碼后再自己寫的緣故. 祇 ...
- 浏览器全屏事件(Html5)
<button onclick="launchFullscreen(document.documentElement);"></button> functi ...
- Js函数的概念、作用、创建、调用!
一.函数是用来帮助我们封装.调用代码的最方便的工具! 二.函数的创建方法有三种: 三.函数的创建方式有3种,调用方式也不是单一的,调用方式有4种! 1.作为一个函数去调用 函数名+();(函 ...
- 通过一组RESTful API暴露CQRS系统功能
命令和查询责任分离(CQRS)是由Greg Young提出的一种将系统的读(查询).写(命令)操作分离为两种独立子系统的架构模式.命令通常是异步执行的,并存储在一个事务型数据库中,而读操作则通常是最终 ...
- RESTful API 设计最佳实践
背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...
- .NET单元测试的艺术-2.核心技术
开篇:上一篇我们学习基本的单元测试基础知识和入门实例.但是,如果我们要测试的方法依赖于一个外部资源,如文件系统.数据库.Web服务或者其他难以控制的东西,那又该如何编写测试呢?为了解决这些问题,我们需 ...
- 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构
一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...
- 在Visual Studio上开发Node.js程序
[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...
- CSS3 Animation制作飘动的浮云和星星效果
带平行视差效果的星星 先看效果: 如果下方未出现效果也可前往这里查看 http://sandbox.runjs.cn/show/0lz3sl9y 下面我们利用CSS3的animation写出这样的动画 ...