初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序

初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查

2016-07-24

一、创建T4模板,建立与SQL Sever数据库的连接(有两种形式:我们后面使用方法1)

 右键【Models】-->添加-->新建项-->选择数据-->ADO.NET实体数据模型

此处有两个选择:1、基于已有的SQL Sever数据库生成。2、先建立数据库模型,然后根据所建立的模型生成所需的数据库。

1、选择从数据库生成

下一步

新建连接-->服务器名.(.表示主机)-->选择或输入数据库名称Ddup

DdupEntities为之后创建EF上下文容器的实体类名

下一步(勾选所需添加到模型中的数据库表)

 点击【完成】,T4模板根据数据库生成对应的实体模型

2、选择空模型(EF Code First)

在空白处右键-->选择新增-->实体

 实体名称T001Admin对应生成的数据库表名T001Admin;实体集默认的是T001AdminSet,将其改为与实体名称一致;键属性为该实体的主键(Code First会在数据库中默认将该主键Id设置为自增长)

这样我们就创建好了一个带有自增主键Id的表T001Admin 

现在来创建T001Admin实体的其他属性。

右键【属性】-->新增-->标量属性;然后修改其名称为:Account。

右键【Account】-->属性,设置Account的属性

以此类推,创建了T001Admin表和T002AdminGroup表

建立主外键关联:菜单栏选择【视图】-->工具箱,点击【关联】

点击T001Admin表的【Id】-->再点击T002AdminGroup表的fk_T001Admin,这样主外键关联就建立好了

 然后,在编辑区右键-->根据模型生成数据库(在此之前,得先在SQL Sever中新建一个数据库:Ddup)

新建连接-->服务器名.(.表示主机)-->选择或输入数据库名称(选择此前已经创建好的数据库Ddup)

确定-->下一步,此处是T4模板根据所建立的模型,将其转换成sql语句,存储在Models下的Model1.edmx.sql文件的

 点击【完成】,这样就生成了对应的sql文件

点击左上角的,Server name为.

点击【Connect】,消息中显示已成功完成命令,那么在Ddup数据库中就已经成功生成了我们之前所建立的实体模型所对应的数据库表

注意点:此处的Model1Container为我们之后创建EF上下文容器的名称

我们可以在此Web.config中重新命名,将name=“Model1Container”修改为name=“DBEntities”

  <connectionStrings>
<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-Ddup-20160724074025;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-Ddup-20160724074025.mdf" />
<add name="Model1Container" connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=Ddup;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

然后在Model1.Context.cs中将Model1Container都修改为DBEntities

修改前:

    public partial class Model1Container : DbContext
{
public Model1Container()
: base("name=Model1Container")
{
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
} public DbSet<T001Admin> T001Admin { get; set; }
public DbSet<T002AdminGroup> T002AdminGroup { get; set; }
}

修改后:

public partial class DBEntities : DbContext
{
public DBEntities()
: base("name=DBEntities")
{
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
} public DbSet<T001Admin> T001Admin { get; set; }
public DbSet<T002AdminGroup> T002AdminGroup { get; set; }
}

 三、创建第一个Model--M001LoginDemo.cs

右键【Models】-->添加-->类(M001LoginDemo.cs

DdupEntities为之前配置的web.config中的实体连接名称

using Ddup.Models.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Ddup.Models
{
/// <summary>
/// 登录模型演示
/// </summary>
public class M001LoginDemo
{
#region 1.0:判断能否登录方法一(个人不推荐)
/// <summary>
/// 1、定义的一个返回类型为 Boolean 型的方法
/// 2、将来在Controller中接收true or false来判断是否允许登录
/// </summary>
/// <param name="username"></param>
/// <param name="pwd"></param>
/// <returns>true or false</returns>
public static Boolean LoginDemo1(string account, string pwd)
{
//初始化EF上下文容器
DdupEntities db = new DdupEntities(); //m => m.Account此为lambda表达式
//db.T001Admin.FirstOrDefault(m => m.Account == account && m.Password == pwd);返回类型为T001Admin,所以定义强类型T001Admin来接收
//T001Admin model = db.T001Admin.FirstOrDefault(m => m.Account == account && m.Password == pwd); //var 可以很智能的识别所需接收的强类型并转换成它
var model = db.T001Admin.FirstOrDefault(m => m.Account == account && m.Password == pwd);
if (model == null)
{
return false;
}
else
{
return true;
}
}
#endregion #region 判断登录方法二
/// <summary>
/// 1、定义的一个返回类型为 T001Admin 型的方法
/// 2、将来在Controller中接收 是否为null 来判断是否允许登录
/// </summary>
/// <param name="account"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public static T001Admin LoginDemo2(string account, string pwd)
{
//初始化EF上下文容器
DdupEntities db = new DdupEntities(); return db.T001Admin.FirstOrDefault(m => m.Account == account && m.Password == pwd);
}
#endregion #region 判断登录方法三(推荐)
/// <summary>
/// 1、定义的一个返回类型为 T001Admin 型的方法
/// 2、将来在Controller中接收 是否为null 来判断是否允许登录
/// 3、此处用模型(Vm001登录视图模型)做为参数类型,此前需在Models下
/// 添加新建文件夹ViewModel,然后在ViewModel下创建 Vm001登录视图模型.cs,
/// 最后需要导入命名空间,在开头添加 using Ddup.Models.ViewModel;
/// </summary>
/// <param name="account"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public static T001Admin LoginDemo3(Vm001登录视图模型 model)
{
//初始化EF上下文容器
DdupEntities db = new DdupEntities(); return db.T001Admin.FirstOrDefault(m => m.Account == model.account && m.Password == model.pwd);
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Ddup.Models.ViewModel
{
public class Vm001登录视图模型
{
public string account { get; set; }
public string pwd { get; set; }
public string Vcode { get; set; }
}
}

四、创建一个Controller--C01LoginController.cs(我们在这里选择--MVC 5控制器-空)

右键【Controllers】-->添加-->控制器

using Ddup.Models;
using Ddup.Models.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace Ddup.Controllers
{
public class C01LoginController : Controller
{public ActionResult Login()
{
return View();
} [HttpPost]
public ActionResult Login(Vm001登录视图模型 model)
{
try
{
if (ModelState.IsValid)
{
#region 1.0:登录演示方法一
//var userinfo1 = M001LoginDemo.LoginDemo1(model.account, model.pwd);
//if (userinfo1 == true)
//{
// RedirectToAction("Index","Home");
//}
#endregion #region 2.0:登录演示方法二
//var userinfo2 = M001LoginDemo.LoginDemo2(model.account, model.pwd);
//if (userinfo2 != null)
//{
// RedirectToAction("Index","Home");
//}
#endregion #region 3.0:登录演示方法3
var userinfo3 = M001LoginDemo.LoginDemo3(model);
if (userinfo3 != null)
{
RedirectToAction("Index","Home");
}
#endregion
}
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
}
return View("Error");
} }
}

五、创建一个登录视图Login.cshtml

右键【Login】创建登录视图

@model Ddup.Models.ViewModel.Vm001登录视图模型

@{
ViewBag.Title = "Login";
} @using(Html.BeginForm())
{
@Html.ValidationSummary(true)
<div class="form-group" style="height:40px;margin-top:50px">
<div class="row">
@Html.LabelFor(m => m.account, new { @class = "col-md-5 control-label", @style = "text-align:right", @for = "account" })
<div class=" col-md-7">
@Html.TextBoxFor(m => m.account, new { @class = "form-control", placeholder = "请输入用户名", @style = "width:240px;", id = "account" })
@Html.ValidationMessageFor(m => m.account)
</div>
</div>
</div>
<div class="form-group" style="height:40px;">
<div class="row">
@Html.LabelFor(m => m.pwd, new { @class = "col-md-5 control-label", @style = "text-align:right", @for = "pwd" })
<div class=" col-md-7">
@Html.PasswordFor(m => m.pwd, new { @class = "form-control", placeholder = "请输入密码", @style = "width:240px;", id = "pwd" })
@Html.ValidationMessageFor(m => m.pwd)
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-5"></div>
<div class="col-md-2 col-xs-4">
<input type="submit" value=" 登录" class="btn btn-default" />
</div>
<div class="col-md-5 col-xs-8">
<input type="reset" value=" 重置" class="btn btn-default" />
</div>
</div>
}

 六、创建验证码

在C01LoginController.cs控制器下创建,代码如下:

#region 验证码
public MemoryStream Get_Images(int fontSize, int charNumber, string backgroundColor)
{
//把字符转换为图像,并且保存到内存流 //这个数字在调用页面需要,你要自己算出明确值,注意!注意!注意!
var imageW = Convert.ToInt32(fontSize * 1.3) + fontSize * charNumber; //这个数字在调用页面需要,你要自己算出明确值,注意!注意!注意!
var imageH = Convert.ToInt32(2.5 * fontSize); //封装GDI+位图
//封装GDI+绘图面
var colorBack = ColorTranslator.FromHtml(backgroundColor); //背景颜色 //注意!注意! 确定背景大小
var tempBitmap = new Bitmap(imageW, imageH, PixelFormat.Format32bppRgb); //注意!注意! 绘制背景
var tempGraphics = Graphics.FromImage(tempBitmap);
tempGraphics.FillRectangle(new SolidBrush(colorBack), new Rectangle(, , imageW, * imageH)); //为了进行验证比较
var ran = new Random();
var codeint = ran.Next(, );
var Vcode = Convert.ToString(codeint); //将结果放入session中
Session["Vcode"] = Vcode;
tempGraphics.DrawString(Vcode, new Font("Arial", ), new SolidBrush(Color.Black), , ); //背景透明
tempBitmap.MakeTransparent(colorBack); var tempStream = new MemoryStream();
tempBitmap.Save(tempStream, ImageFormat.Png);
//释放资源
tempGraphics.Dispose();
//释放资源
tempBitmap.Dispose();
//关闭打开的流文件
tempStream.Close();
//返回流
return tempStream;
} /// <summary>
/// 验证图片
/// </summary>
/// <returns></returns>
public FileContentResult GetImage()
{
var myStream = Get_Images(, , "#ffffff");
return File(myStream.GetBuffer(), "image/Png");
} [HttpPost]
public JsonResult CheckValidationCode(string Vcode)
{
try
{
return Json(Vcode == Session["Vcode"].ToString());
}
catch (Exception)
{
return Json(false);
throw;
}
}
#endregion

注意点:1、需要在Vm001登录视图模型中添加一个字段,完成代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; //使用Remote所需程序集
using System.Web.Mvc; namespace Ddup.Models.ViewModel
{
public class Vm001登录视图模型
{
public string account { get; set; }
public string pwd { get; set; } [Remote("CheckValidationCode", "C01Login", ErrorMessage = "验证码错误", HttpMethod = "POST")]
public string Vcode { get; set; }
}
}

2、需要在母版页(~/Views/Shared/_Layout.cshtml)中导入Validate脚本和Validate的非侵入式脚本(如果没有可以在nutget中下载)

jquery.validate.js,
jquery.validate.unobtrusive.js

最后,我们只需在Login视图中添加

    <div class=" form-group">
@Html.LabelFor(m => m.Vcode, new { @class = "col-md-5 control-label", @style = "text-align:right;", @for = "Vcode" })
<div class="col-md-2">
@Html.TextBoxFor(m => m.Vcode, new { @class = "form-control col-xs-2", placeholder = "验证码", @style = "width:80px;", id = "Vcode" })
</div>
<div>
<img src="~/C01Login/GetImage" alt="验证码" id="vcodeimg" style="cursor:pointer;" />
@Html.ValidationMessageFor(m => m.Vcode)
</div>
</div>

这样我们的验证码功能就实现了O(∩_∩)O哈哈~

本人属于初学者,如果有何不足,还请见谅,也希望大家多多给意见,谢谢!!!

=================================================================================================

作者:程程程
出处:http://rcddup.cnblogs.com
本文由程程程原创,并发布到博客园,欢迎转载,但必须在文章页面明显位置写明作者和出处,非常感谢!

初入码田--ASP.NET MVC4 Web应用开发之一 实现简单的登录的更多相关文章

  1. 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查

    初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序 初入码田--ASP.NET MVC4 Web应用开发之一 实现简单的登录 2016-07-29  一.创建M002Adm ...

  2. 初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序

    初入码田--ASP.NET MVC4 Web应用开发之一  实现简单的登录 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查 2016-07-29 在此之前,需要一台电脑( ...

  3. ASP.NET Core Web API 开发-RESTful API实现

    ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...

  4. 关于ASP.NET MVC4 Web API简单总结

    原文地址:http://www.cnblogs.com/lei2007/archive/2013/02/01/2888706.html wcf web api 和 asp.net web api , ...

  5. 《ASP.NET MVC4 WEB编程》学习笔记------Model模型绑定

    本文转载自haiziguo Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对 ...

  6. 《ASP.NET MVC4 WEB编程》学习笔记------Web API 续

    目录 ASP.NET WEB API的出现缘由 ASP.NET WEB API的强大功能 ASP.NET WEB API的出现缘由 随着UI AJAX 请求适量的增加,ASP.NET MVC基于Jso ...

  7. 《ASP.NET MVC4 WEB编程》学习笔记------Web API

    本文截取自情缘 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集 ...

  8. 【ASP.NET+MVC4+Web+编程】读书笔记

    模型:数据和业务逻辑 视图:展示 控制器:接收视图输入数据,通过模型层业务逻辑处理后 返回给视图 分离关注点(模型 视图 控制器).惯例优先原则 browser-->routing-->c ...

  9. 初入spring boot(四 )web项目

    1. 模板引擎 spring boot提供了大量的模板引擎,包括FreeMark.Groovy.Thymeleaf.Velocity等,但spring boot中推荐用Thymeleaf,因为Thym ...

随机推荐

  1. 4008: [HNOI2015]亚瑟王

    4008: [HNOI2015]亚瑟王 链接 分析: 根据期望的线性性,直接求出每张牌出现的概率,最后乘以攻击力就是答案. 每张牌出现的概率只与它前面的牌有关,与后面的没有关系,于是按顺序考虑每张牌. ...

  2. Linux日常积累

      1. /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量,写在 /etc/profile 里面的是对所有用户永久 ...

  3. 如何让mysql按照两个或多个字段排序

    我准备设计一个供求信息的表格,里边包含序号(id)(自动增量),发布日期(time),上次更新(last_time).因为考虑到避免有人不停的重复发布信息来占据前列位置所以设置了last_time这个 ...

  4. navicat连接mysql出现1251错误

    刚刚安装热乎的navicat发现出现1251错误,原因不大清楚,找到一个解决办法: 将mysql的密码重新重置一遍: 1.打开命令行 ,进入mysql所在的目录,输入 mysql -uroot -p ...

  5. 004 --Mysql中的锁的问题

    死锁 死锁是指两个或多个事务在同一个资源上相互占用, 并请求锁定对方占用的资源, 从而导致恶性循环的现象. 当多个事务试图以不同顺序锁定资源时, 就可能产生死锁.死锁发生以后, 只有部分或者完全回滚其 ...

  6. PPIO去中心化存储的了解和记录

    目录 介绍 FileCoin P2P技术给去中心化云存储的好处 剩余资源的再次使用 市场竞争会激发民间的智慧 PPIO的2种冗余模式 全副本模式 纠删副本模式 为什么PPIO要设计支付代理节点? 一些 ...

  7. python之爬虫_模块

    目录 一.requests模块二.Beautifulsoup模块 一.requests模块 1.介绍 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但 ...

  8. iOS静态库.a总结(2017.1.24增加脚本打包方法)

    修改于:2017.1.24 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImag ...

  9. php 常用英语小汇

    bstract抽象的 -挨伯丝拽克特 access存取.访问 -挨克色丝 account账户 -厄靠恩特 action动作 -爱克身 activate激活 -爱克特维特 active活动的 -爱克得 ...

  10. Vue实现双向绑定的原理以及响应式数据

    一.vue中的响应式属性 Vue中的数据实现响应式绑定 1.对象实现响应式: 是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集 ...