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 ...
随机推荐
- IDEA如何配置jdk路径
首先要确定你的jdk已经安装好了 Win + R键,输入cmd 输入java -version 当返回这玩意的时候,就证明你的jdk已经安装成功,可以用IDEA进行配置了 打开IDEA的 File → ...
- 3.MapReduce原理和Yarn
1.MapReduce原理 2.MapReduce执行时间 3.MapReduce开发 4.Yarn
- System 源码阅读
System 属性说明 /** * System 类包含了几个有用的字段和方法,并且不能被实例化. * * @author unascribed * @since 1.0 */ public fina ...
- 转发:Java对象及其引用
原文: http://zwmf.iteye.com/blog/1738574 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知 ...
- ConstraintLayout的简单介绍和使用
ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能.我们都知道,在传统的Android开发当中,界面基本 ...
- ControlTemplate in WPF —— Calendar
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...
- TreeSet简单介绍与使用方法
TreeSet简介 TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet< ...
- 【转】Java从hdfs上读取文件中的某一行
[From]https://blog.csdn.net/u010989078/article/details/51790166 package test; import java.io.Buffere ...
- Opencv中的WMesh
费了半天劲,终于把这个WMesh类搞懂了,可惜效果不佳,比Matlab中的mesh差多了. 使用WMesh前,需要有一个Mesh对象,Mesh是三维数据点的基本几何信息.颜色信息.索引信息等集成的对象 ...
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...