oa_mvc_easyui_登录完成(2)
1.使用MVC特有的ajax方式:异步表单提交方式
js文件引用:<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
代码:
@using(Ajax.BeginForm("UserLogin",new{},new AjaxOptions(){OnSuccess="afterLogin"},new{id="loginForm"})){
......
//相关的表单
}
**
使用Ajax.BeginForm方法会生成一个form表单,最后以Ajax的方式提交表单数据;需要用using把该方法括起来,使系统知道form表单从何处开始,何处结束。
new AjaxOptions(){...} -- ajax的一些参数
new {id="loginForm"} -- htmlAttributes,html属性,生成form表单时,会把键值对添加到form表单的属性中
new{} -- routeValues...
"CheckLogin" -- 指定请求地址的Action名称
参考:http://www.cnblogs.com/zzgblog/p/5454019.html?_t=t
http://www.cnblogs.com/haof3344/p/4659040.html
2. 控制器LoginController中编写登录的方法:UserLogin(),用于异步ajax刷新
LoginController:UserLogin
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Itcast.CMS.Model;
using Itcast.CMS.BLL; namespace Itcast.CMS.WebApp.Controllers
{
public class LoginController : Controller
{
//约定大于配置
// GET: /Login/ public ActionResult Index()
{
return View();
} public ActionResult UserLogin()
{
//判断Session中的验证码是否为空
string validateconde = Session["validateCode"].ToString() == null ? string.Empty : Session["validateCode"].ToString();
if(string.IsNullOrEmpty(validateconde))
{
return Content("no:验证码错误!");
}
Session["validateCode"] = null;
//判断验证码是否正确
string vcode = Request["vCode"].ToString();
if(!vcode.Equals(validateconde,StringComparison.InvariantCultureIgnoreCase))
{
//StringComparison.InvariantCultureIgnoreCase 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写
return Content("no:验证码错误!");
}
//判断用户名和密码
string username = Request["LoginCode"];
string userpwd = Request["LoginPwd"];
UserInfoService UserInfoService = new UserInfoService();
T_UserInfo UserInfo = UserInfoService.GetUserInfoMode(username,userpwd);
if (UserInfo != null)
{
Session["UserInfo"] = UserInfo;//UserInfo对象赋值给Session,
//调用((T_UserInfo)Session["UserInfo"]).UserName;
return Content("ok:登录成功!!");
}
else
{
return Content("no:用户名密码错误");
}
} /// <summary>
/// 生产验证码
/// </summary>
/// <returns></returns>
public ActionResult ValidateCode()
{
Common.ValidateCode validateCode = new Common.ValidateCode();
string code = validateCode.CreateValidateCode();//生成验证码
Session["validateCode"] = code;//存储于Session中
byte[] buffer = validateCode.CreateValidateGraphic(code);//创建验证码的图片
return File(buffer, "image/jpeg");
}
}
}
3.UserInfoDal层中编写具体方法GetUserInfoMode,LoadEntity用户赋值给T_UserInfo类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Itcast.CMS.Model;
using System.Data.SqlClient;
using System.Data; namespace Itcast.CMS.DAL
{
public class UserInfoDal
{ public T_UserInfo GetUserInfoMode(string username, string userpwd)
{
string sql = " select * from T_UserInfo where UserName=@UserName and UserPwd=@UserPwd ";
SqlParameter[] pars = {
new SqlParameter("@UserName",SqlDbType.NVarChar,),
new SqlParameter("@UserPwd",SqlDbType.NVarChar,)
//SqlDbType.NVarChar 数据库中的类型
};
pars[].Value = username;
pars[].Value = userpwd;
DataTable dt = DAL.SqlHelper.SelectSqlReturnDataTable(sql, CommandType.Text, pars);
T_UserInfo userinfo = null;
if (dt.Rows.Count > )
{
userinfo = new T_UserInfo();
LoadEntity(dt.Rows[], userinfo);
}
return userinfo;
} public void LoadEntity(DataRow row, T_UserInfo userInfo)
{
userInfo.Id = Convert.ToInt32(row["id"].ToString());
//DBNull.Value 判断是否为null值
userInfo.UserName = row["UserName"] != DBNull.Value ? row["UserName"].ToString() : string.Empty;
userInfo.UserPwd = row["UserPwd"] != DBNull.Value ? row["UserPwd"].ToString() : string.Empty;
userInfo.UserMail = row["UserMail"] != DBNull.Value ? row["UserMail"].ToString() : string.Empty;
userInfo.RegTime = Convert.ToDateTime(row["RegTime"]);
} }
}
4.业务层:UserInfoService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Itcast.CMS.Model; namespace Itcast.CMS.BLL
{
public class UserInfoService
{
DAL.UserInfoDal UserInfoDal = new DAL.UserInfoDal();
public T_UserInfo GetUserInfoMode(string username, string userpwd)
{
return UserInfoDal.GetUserInfoMode(username, userpwd);
}
}
}
5.afterLogin回调函数,对后台返回的数据做处理
function afterLogin(data) {
var serverData = data.split(':');
if (serverData[0] == "ok") {
window.location.href = "/Home/Index"
} else if (serverData[0] == "no") {
$("#errorMsg").text(serverData[1]);
changeCheckCode();
} else {
window.location.href = "/Error.html"
}
}
oa_mvc_easyui_登录完成(2)的更多相关文章
- oa_mvc_easyui_项目搭建及登录页面验证码(1)
1.空项目的搭建,三层的搭建(各层之中的引用) webapp:bll,model,common bll:dal,model dal:model 2.SQL表 ItcastDb:T_UserInfo,T ...
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- TODO:Laravel 内置简单登录
TODO:Laravel 内置简单登录 1. 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管 ...
- web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)
这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- PHP验证用户登录例子-学习笔记
1.基本流程: 2.UML类图: 3.PHP代码: 3.1 index.php <?php /** * Created by PhpStorm. * User: andy * Date: 16- ...
- AJAX实现登录界面
使用php跳转界面和AJAX都可实现登录界面的跳转的登录失败对的提醒.但是,php跳转的方式 需要额外加载其他界面,用户体验差.AJAX可实现当前页面只刷新需要的数据,不对当前网页进行 重新加载或者是 ...
- 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别
假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionI ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
随机推荐
- leetcode题目17.电话号码的字母组合(中等)
题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出: ...
- ZooKeeper分布式锁的实现原理
七张图彻底讲清楚ZooKeeper分布式锁的实现原理[石杉的架构笔记] 文章转载自:https://juejin.im/post/5c01532ef265da61362232ed#comment(写的 ...
- TCP层close系统调用的实现分析
在调用close系统调用关闭套接字时,如果套接字引用计数已经归零,则需继续向上层调用其close实现,tcp为tcp_close:本文仅介绍tcp部分,前置部分请参考本博关于close系统调用的文章: ...
- umount 报错was not found in /proc/mounts
前段时间在整理服务器时,看到nfs都是通过公网调用的,但是实际这几台服务器都是可以内网互通的,为了更稳定的使用,打算把这些挂载都更改为通过内网ip挂载,什么都设置好之后,操作第一台服务器没有问题,um ...
- SQLite 使用主键,ROWID 及自增列
SQLite 使用主键,ROWID 及自增列 之前关注过一些嵌入式数据库,倒时 SQLite 风头更劲,在 Android 上被应用,在 HTML5 中一些浏览器的 Local Database 的实 ...
- LC 851. Loud and Rich
In a group of N people (labelled 0, 1, 2, ..., N-1), each person has different amounts of money, and ...
- Message 消息提示
常用于主动操作后的反馈提示.与 Notification 的区别是后者更多用于系统级通知的被动提醒. 基础用法 从顶部出现,3 秒后自动消失. Message 在配置上与 Notification 非 ...
- Ironic 的 Rescue 救援模式实现流程
目录 文章目录 目录 救援模式 实现 UML 图 救援模式 以往只有虚拟机支持救援模式,裸机是不支持的.直到 Queen 版本 Ironic 实现了这个功能.救援模式下,用户可以完成修复.Troubl ...
- nvm 安装及操作 node版本管理
安装 > curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash 安装完成后重启下 ...
- VMware重装:网络适配器驱动安装失败解决办法
参考链接:https://blog.csdn.net/theConqueror/article/details/80449125