3、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle项目开发之——用户登录
近期因为项目赶着上线,一直没时间接着写博客,今天最终空出了时间。声名:我不是专业美工,所以界面问题,希望大家不要拍砖。登录界面例如以下:
在ASP.NET MVC中,要新增一个功能,我们首先要加入一个控制器,AccountController.cs,加入方法:右键单击Controllers目录,
/// <summary>
/// 登录页面
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
return View();
}
/// <summary>
/// 点击 登录系统 后取消
/// </summary>
/// <param name="model">登录信息</param>
/// <returns></returns>
[HttpPost]
public ActionResult Index(LogOnModel model)
{
#region 验证码验证 if (Session["_VCode"] != null && model.ValidateCode!=null&& model.ValidateCode.ToLower() != Session["_VCode"].ToString())
{
ModelState.AddModelError("PersonName", "验证码错误!"); //return "";
return View();
}
#endregion if (ModelState.IsValid) //这个是界面数据的模型验证 相应LogOnModel模型类中 诸如:[Required(ErrorMessage = "请填写username")] 必填 ...等验证
{
SMUSERTB person = _accountService.ValidateUser(model.PersonName, xEncrypt.EncryptText(model.Password));
if (person != null) //登录成功
{
Account account = new Account();
account.USER_NAME = person.USER_NAME;
account.UID = person.U_ID;
account.USER_ID = person.USER_ID;
account.GuidCode = person.GUILD_CODE;
Session["account"] = account; return RedirectToAction("Index", "Home");
}
} ModelState.AddModelError("PersonName", "username或者password出错。");
return View();
}
public void ValidateCode()
{
Response.ClearContent(); //须要输出图象信息 要改动HTTP头
Response.ContentType = "image/jpeg"; ValidateCodeFun.CreateValidateCode(4);
}
当中LogOnModel是专门为登录进行设计的业务模型,
public class LogOnModel
{
[Required(ErrorMessage = "请填写username")]
[DisplayName("username")]
public string PersonName { get; set; } [StringLength(100, ErrorMessage = "{0} 必须至少包括 {2} 个字符。", MinimumLength = 3)]
[Required(ErrorMessage = "请填写password")]
[DataType(DataType.Password)]
[DisplayName("password")]
public string Password { get; set; } [Required(ErrorMessage = "请填写验证码")]
[DisplayName("验证码")]
public string ValidateCode { get; set; } [DisplayName("记住我?")]
public bool RememberMe { get; set; }
}
关于验证码类,我就不多说了,大家都懂,我这里直接贴代码,例如以下:
public static class ValidateCodeFun
{
public static void CreateValidateCode(int codeNum)
{
string vnum= GetByRndNum(codeNum); Bitmap Img = null;
Graphics g = null;
Random random = new Random();
int gheight = vnum.Length * 16;
Img = new Bitmap(gheight, 26);
g = Graphics.FromImage(Img);
//Font f = new Font("微软雅黑", 16, FontStyle.Bold);
Color[] c = { Color.SpringGreen, Color.Red, Color.LightBlue, Color.SeaGreen, Color.Orange, Color.Yellow, Color.RosyBrown }; Font f = new Font("宋体", 16, FontStyle.Bold); g.Clear(Color.White);//设定背景色
//Pen blackPen = new Pen(ColorTranslator.FromHtml("#e1e8f3"), 18);
Pen blackPen = new Pen(c[random.Next(7)], 18); //绘图片的前景噪音点
for (int i = 0; i < 80; i++)
{
int x = random.Next(Img.Width);
int y = random.Next(Img.Height);
Img.SetPixel(x, y, Color.FromArgb(random.Next()));
} for (int i = 0; i < 128; i++)// 随机产生干扰线,使图象中的认证码不易被其他程序探測到
{
int x = random.Next(gheight);
int y = random.Next(20);
int xl = random.Next(6);
int yl = random.Next(2);
g.DrawLine(blackPen, x, y, x + xl, y + yl);
} SolidBrush s = new SolidBrush(ColorTranslator.FromHtml("#411464"));
g.DrawString(vnum, f, s, 1, 1); //画边框
blackPen.Width = 1;
g.DrawRectangle(blackPen, 0, 0, Img.Width - 1, Img.Height - 1);
Img.Save(HttpContext.Current.Response.OutputStream, ImageFormat.Jpeg);
s.Dispose();
f.Dispose();
blackPen.Dispose();
g.Dispose();
Img.Dispose(); //Response.End();
} //-----------------给定范围获得随机颜色
static Color GetByRandColor(int fc, int bc)
{
Random random = new Random(); if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.Next(bc - fc);
int g = fc + random.Next(bc - fc);
int b = fc + random.Next(bc - bc);
Color rs = Color.FromArgb(r, g, b);
return rs;
} //取随机产生的认证码(数字)
public static string GetByRndNum(int VcodeNum)
{
string VNum = "";
Random rand = new Random();
for (int i = 0; i < VcodeNum; i++)
{
VNum += VcArray[rand.Next(0, 61)];
}
HttpContext.Current.Session["_VCode"] = VNum.ToLower();
return VNum;
}
private static readonly string[] VcArray =
new string[] {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i",
"j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G",
"H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z" };
}
最后,看下视图View,新建View方法例如以下:
View十分简单,这里我就不多说,自己看代码,例如以下:
@model YKT.Model.LogOnModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head id="Head1">
<title>企业平台登录</title>
<link href="@Url.Content("~/Content/Login.css")" rel="stylesheet" type="text/css" />
<script type="text/javascript">
function RefreshValidateCode(obj) {
obj.src = "/Account/ValidateCode/" + Math.floor(Math.random() * 10000);
}
</script>
</head>
<body>
@using (Html.BeginForm((string)ViewBag.FormAction, "Account"))
{
<div class="login">
<div class="top">
</div>
<div class="middle">
<div class="left">
<img alt="登录" src="images/login_pic.gif"></div>
<div class="right">
<div class="right2">
<fieldset style="border-top: 0px; border-left: #e8e8e8 1px solid; border-right: #e8e8e8 1px solid;
border-bottom: #e8e8e8 1px solid;">
<div class="editor-label">
username:
</div>
<div class="personname">
@Html.TextBoxFor(m => m.PersonName)
</div>
<div class="editor-label">
密 码:
</div>
<div class="password">
@Html.PasswordFor(m => m.Password)
</div>
<div class="editor-label" >
验证码:
</div>
<div class="validatecode">
@Html.TextBoxFor(m => m.ValidateCode, new { MaxLength = "4",@class="easyui-validatebox",required="true",
missingMessage="不能为空"})
<img alt="点击刷新验证码!" title="点击刷新验证码!" src="Account/ValidateCode" style="cursor: pointer;"
onclick="RefreshValidateCode(this);" />
</div>
<p>
<input class="submitcss" type="submit" value="登录系统" />
<span style="display:none">
@Html.CheckBoxFor(m=>m.RememberMe,"记住我")
@Html.LabelFor(m=>m.RememberMe)
</span>
</p>
<p>
@Html.ValidationMessageFor(m => m.PersonName)<br />
@Html.ValidationMessageFor(m => m.Password)
</p>
</fieldset>
</div>
</div>
</div>
<div class="bottom">
</div>
</div>
}
</body>
</html>
3、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle项目开发之——用户登录的更多相关文章
- 5、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle该项目的开发——使用datagrid做报表
来点需要:我使用的数据库访问EF框架,但是,因为使用一个动态表来的统计报告中.单独是每天产生基于数据表,它是很难使用EF加盟前.所以我包装在两组数据库存取层的框内,一个是EF,一种是传统的ADO.NE ...
- oracle:os认证用户登录测试
90%的情况下,我们使用的都是数据库认证用户登录oracle,但还存在使用OS认证用户登录oracle的情况: 下面就实验一下OS用户要登录oracle相关操作: 测试环境:oracle10. ...
- MVC4项目中验证用户登录一个特性就搞定
在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问. [AttributeUsage(Attribu ...
- asp.net -mvc框架复习(9)-实现用户登录控制器和视图的编写并调试
1.编写控制器 三个步骤: [1]获取数据 [2]业务处理 [3]返回数据 using System;using System.Collections.Generic;using System.Lin ...
- asp.net -mvc框架复习(8)-实现用户登录模型部分的编写
1.配置文件添加数据库连接字符串(web.config) 2.编写通用数据库访问类 (1)引入命名空间 using System.Configuration; (2) 定义连接字符串 (3)编写完成 ...
- ASP.NET Core的身份认证框架IdentityServer4--(5)自定义用户登录(使用官网提供的UI)
IdentityServer官方提供web页面,可以根据需求修改样式.具体UI下载跟配置参考官网文档. 文档地址:https://identityserver4.readthedocs.io/en/r ...
- ASP.NET Core的身份认证框架IdentityServer4--(5)自定义用户登录(通过接口登录,无UI版本)
官网接口详解文档地址:文档地址 (PS:可通过接口名称搜索相应接口信息.) 源码地址:https://github.com/YANGKANG01/IdentityServer4-IdentityAut ...
- [转]MVC4项目中验证用户登录一个特性就搞定
本文转自:http://www.mrhuo.com/Article/Details/470/A-Attribute-For-MVC4-Project-Used-To-Validate-User-Log ...
- 【转】Asp.Net MVC4 之Url路由
MVC4常见路由的处理方式 //直接方法重载+匿名对象 routes.MapRoute( name: "Default", url: "{controller}/{act ...
随机推荐
- CodeForces 135 B. Rectangle and Square(判断正方形和 矩形)
题目:http://codeforces.com/problemset/problem/135/B 题意:给8个点 判断能否用 4个点构成正方形,另外4个点构成 矩形. 输出 第一行是正方形 ,第二行 ...
- php 连接字符串. ZEND_ASSIGN_CONCAT/ZEND_CONCAT原理
0.php代码 <?php $a='abc'; $b='def'; $c='ghi';$d='jkl'; $a.=$b.$c.$d; 1.BNF范式(语法规则) expr_without_var ...
- 利用Merge Into 更新表,集合数据到数据库中
使用Merge INTO 将表数据更新到数据库中 创建User-Defined Table Types 创建要更新的UserDetails表 创建更新存储过程 程序调用存储过程 查看结果
- Android 隐藏RadoiButton左边按钮
声明方式 添加属性 android:button=“@null”? 代码方式 radioBtn.setButtonDrawable(new StateListDrawable());
- Hibernate4.x之Session
Hibernate Session概述 Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个 ...
- NetCat简介与使用方法
精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...
- python运算符的优先级
运算符优先级 如果你有一个如2 + 3 * 4那样的表达式,是先做加法呢,还是先做乘法?我们的中学数学告诉我们应当先做乘法——这意味着乘法运算符的优先级高于加法运算符. 下面这个表给出Python的运 ...
- C++ ODR规则与dlopen 问题
问题: 开发平台*.so插件的时候遇到相同的函数名称出现在不同的.so文件中,假设分别为a.so和b.so,b.so要使用a.so中的定义函数 a(),而在dlopen会先加载a.so然后加载b.so ...
- 设计模式_Flyweight_享元模式
形象例子: 每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了.共享的句子就是Flywe ...
- 使用 cloc 统计代码行数
可能大家都知道用 `wc -l` 命令进行代码行数统计,但是它会将代码中的注释.空行所占用的文本行都统计在内.如果想查看一个 tar 包或一个项目目录中“实际”的代码行数并且不愿意自己去写一个脚本来做 ...