ASP.NET MVC Notes - 01
- inetmgr 进入IIS
- ViewBag和ViewData在run-time的时候检查错误,View中的用法如下:
@*ViewBag传递的是动态对象*@
@foreach (string item in ViewBag.listData)
{
<li>@item</li>
}
-----------------------------------------
@*ViewData传递的是Object,所以要转换类型*@
@foreach (string item in (List<string>)ViewData["Countries"])
{
<li>@item</li>
}- web.config中连接字符串名称需要和DbContext的类名称一致:
public class EmployeeContext : DbContext
{
//定义对应到数据库表的对象集合
public DbSet<Employee> Employees { get; set; }
} <add name="EmployeeContext"
providerName="System.Data.SqlClient"
connectionString="Data Source=.;Initial Catalog=MVCSample;User ID= ;Password= ; " />- Global.ashx 程序运行初始化配置:
//DBFirst从数据读取数据,程序运行的时候EmployeeContext初始化为Null
Database.SetInitializer<MVCBlog.Models.EmployeeContext>(null);- View需要List数组对象,则强类型直接定义为IEnumerable; View中@using引用需要用到的类
@model IEnumerable<MVCBlog.Models.Employee>
@using MVCBlog.Models @{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} <h2>Index</h2> @*Controller 传递过来的是List对象,所以强类型定义为List<MVCBlog.Models.Employee>*@
<ul>
@foreach (Employee employee in @Model)
{
<li> @Html.ActionLink(employee.Name, "Details", new { @id = @employee.EmployeeID }) </li>
}
</ul>- 业务逻辑层获取数据
public IEnumerable<Employee> employees
{
get
{
string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString; List<Employee> employees = new List<Employee>(); using (SqlConnection con = new SqlConnection(connectionString))
{ SqlCommand cmd = new SqlCommand("sp_GetAllEmployee", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
{
Employee employee = new Employee();
employee.EmployeeID = Convert.ToInt32(sdr["EmployeeID"]);
employee.Name = sdr["Name"].ToString();
employee.City = sdr["City"].ToString();
employee.Gender = Convert.ToChar(sdr["Gender"]); employees.Add(employee);
}
return employees;
}
}
}- Razor中构建DropList:
@Html.DropDownList("Gender", new List<SelectListItem> {
new SelectListItem { Text="男",Value="M"},
new SelectListItem{ Text="女",Value="F"}
}, "Select Gender", htmlAttributes: new { @class = "control-label col-md-2" })
//或者是在Controller中构建SelectList后,Razor中Render
ViewBag.DepartID = new SelectList(db.Department, "ID", "Name", employee.DepartID); @Html.DropDownList("DepartID", null, "Select Department",htmlAttributes: new { @class = "form-control" })- Procedure AddEmployee
CREATE PROCEDURE sp_AddEmployee
@Name nvarchar()=null,
@Gender char()=null,
@City nvarchar()=null,
@DateOfBirth DateTime=null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
Insert Into Employee(Name,Gender,City,DateOfBirth)
values(@Name,@Gender,@City,@DateOfBirth)
END
GO- Controller搜集从View页面Post过来的数据,有三种方法:
- FormCollection 中包含了所有表单数据的键值对集合,通过FromCollection[Key] 访问到View Post 过来的 Data
[HttpPost]
public ActionResult Create(FormCollection formCollection)
{
//foreach (string key in formCollection.AllKeys)
//{
// Response.Write(key + " ");
// Response.Write(formCollection[key] + "<br/>");
//} Employee employee = new Employee();
employee.Name = formCollection["Name"];
employee.Gender = Convert.ToChar(formCollection["Gender"]);
employee.City = formCollection["City"];
employee.DateOfBirth = Convert.ToDateTime(formCollection["DateOfBirth"]); EmployeeService employeeService = new EmployeeService();
int numSucc = employeeService.AddEmployee(employee); if (numSucc > )
{
return RedirectToAction("Index");
}
else
{
return View();
}
}
- 直接以参数的形式接收数据
[HttpPost]
public ActionResult Create(string Name,char Gender,string City,string DateOfBirth)
{
Employee employee = new Employee();
employee.Name = Name;
employee.Gender = Gender;
employee.City = City;
employee.DateOfBirth = Convert.ToDateTime(DateOfBirth); EmployeeService employeeService = new EmployeeService();
int numSucc = employeeService.AddEmployee(employee); if (numSucc > )
{
return RedirectToAction("Index");
}
else
{
return View();
}
}
- Controller中UpdaetModel 更新 Model,获得提交过来的数据
[HttpPost]
[ActionName("Create")]
public ActionResult Create_Post()
{
Employee employee = new Employee();
UpdateModel<Employee>(employee); int numSucc = ;
if (ModelState.IsValid)
{
EmployeeService employeeService = new EmployeeService();
numSucc = employeeService.AddEmployee(employee);
} if (numSucc > )
{
return RedirectToAction("Index");
}
else
{
return View();
}
}
- FormCollection 中包含了所有表单数据的键值对集合,通过FromCollection[Key] 访问到View Post 过来的 Data
- Service 新增数据服务:
public int AddEmployee(Employee employee)
{
int numSucc = ;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("sp_AddEmployee", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("Name",employee.Name),
new SqlParameter("Gender",employee.Gender),
new SqlParameter("City",employee.City),
new SqlParameter("DateOfBirth",employee.DateOfBirth)
};
cmd.Parameters.AddRange(paras); conn.Open();
numSucc = cmd.ExecuteNonQuery();
} return numSucc;
}
- 解决方案中的Nuget包管理器对解决方案中的Nuget包进行管理。
Controller中模型绑定的两种方法:
1,Bind 制定需要进行模型绑定传递到Controller中的数据。public ActionResult Edit_Post([Bind(Include = "Gender , City,DateOfBirth")]Employee employee)
2,在UpdateModel中,传递需要更新或者是不需要更新的参数
UpdateModel<Employee>(employee, null, null, new string[] { "Name" });
3,定义IEmployee接口,Employee继承自IEmployee.
UpdateModel<IEmployee>(employee);
- 进行数据的Delete动作必须在Post数据中执行
@foreach (var item in Model)
{
using (Html.BeginForm("Delete", "Employee", new { id = item.ID }))
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Gender)
</td>
<td>
@Html.DisplayFor(modelItem => item.City)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateOfBirth)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
@Html.ActionLink("Details", "Details", new { id = item.ID }) |
<input type="submit" value="Delete" onclick="return confirm('确定删除 @item.Name 吗 ')" />
</td>
</tr>
}
}
- EF中字段属性的控制,如:[Required]、[Display(Name="")] 需在partial class中进行处理
[MetadataType(typeof(EmployeeMetaData))]
public partial class Employee
{ }
public class EmployeeMetaData
{
[Required]
[Display(Name = "姓名")]
public string Name { get; set; } [Required]
[Display(Name = "性别")]
public char Gender { get; set; } [Required]
[Display(Name = "所在城市")]
public string City { get; set; } [Required]
[Display(Name = "生日")]
public DateTime DateOfBirth { get; set; } [Required]
[Display(Name = "部门")]
public int DepartID { get; set; }
}
- Edit信息的时候不需要更新字段的处理,如不需要更新Name。
- partial class 中 去掉 [Required]
- Edit方法中用 查出来的实体来存储更新后的数据
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,Gender,City,DateOfBirth,DepartID")] Employee employee)
{
Employee employeeFromDB = db.Employee.Find(employee.ID); //须要用你查出来的实体来存储更新后的数据,不更新Name字段
employeeFromDB.City = employee.City;
employeeFromDB.Gender = employee.Gender;
employeeFromDB.DepartID = employee.DepartID;
employeeFromDB.DateOfBirth = employee.DateOfBirth; if (ModelState.IsValid)
{
db.Entry(employeeFromDB).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.DepartID = new SelectList(db.Department, "ID", "Name", employee.DepartID);
return View(employee);
}- Controller的Create方法中必需的字段,添加验证检查处理
if (string.IsNullOrEmpty(employee.Name))
{
ModelState.AddModelError("Name", "姓名为必需字段");
}
- Lambda表达式,统计Department下Employee数量
[HttpGet]
public ActionResult EmployeeByDepartment()
{
var departmentTotals = db.Employee.Include("Department")
.GroupBy(d => d.Department.Name)
.Select(y => new DepartmentTotals
{
Name = y.Key,
Total = y.Count()
}).ToList().OrderByDescending(y => y.Total); return View(departmentTotals);
}
- Controller中Return View()中如果指定带有后缀的View,如index.cshtml,则需要传递完整路径:
public ActionResult Index()
{
var employee = db.Employee.Include(e => e.Department);
return View("~/Views/Employee/Index.cshtml",employee.ToList());
}
ASP.NET MVC Notes - 01的更多相关文章
- ASP.NET MVC 5 01 - ASP.NET概述
本篇目录: ASP.NET 概述 .NET Framework 与 ASP.NET ASP.NET MVC简介 ASP.NET的特色和优势 典型案例 ▁▃▅ ASP.NET概述 ▅▃▁ 目前开发B/S ...
- ASP.NET MVC 基础(01)
[ASP.NET MVC ]系列文章大致会包含这样一些内容: 1.ASP.NET MVC 的一些高级知识点: 2.ASP.NET MVC 的一些最新技术: 3.ASP.NET MVC 网站安全方面的知 ...
- ASP.NET MVC:01理解MVC模式
ASP.NET MVC是ASP.NET Web应用程序框架,以MVC模式为基础. MVC:Model View Controller 模型-视图-控制器Model(模型):负责对数据库的存取View( ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
- Asp.Net MVC 实用视频教程
[北盟学习BaMn.Cn] Asp.Net MVC 第01课--创建第一个项目.avi [北盟学习BaMn.Cn] Asp.Net MVC 第02课--自己建一个controller view.avi ...
- [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...
- [ASP.NET MVC 小牛之路]01 - 理解MVC模式
本人博客已转移至:http://www.exblr.com/liam PS:MVC出来很久了,工作上一直没机会用.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各 ...
- [ASP.NET MVC 大牛之路]01 - 开篇
匆匆2014,转眼就到末尾了.在这一年,你还有哪事情些想做而没有做? 2014年在我身上发生了两件意义重大的事,一是正月初一宝宝出生,我升级成为了爸爸:二是进入了一家创业公司,成为了技术负责人. 去年 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...
随机推荐
- windows下 安装Kali Linux到 U盘的方法
作者:玄魂工作室 \ 2016年10月20日 把Kali Linux安装到U盘好处很多,可以从U盘启动使用整个电脑的硬件资源, 可以随身携带,减少对自己电脑的影响. 今天要给大家讲的是如何在windo ...
- iOS开发系列--C语言之预处理
概述 大家都知道一个C程序的运行包括编译和链接两个阶段,其实在编译之前预处理器首先要进行预处理操作,将处理完产生的一个新的源文件进行编译.由于预处理指令是在编译之前就进行了,因此很多时候它要比在程序运 ...
- 迷你MVVM框架 avalonjs 入门教程
新官网 请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-contro ...
- Linux 挂载管理(mount)
标签:mount,umount 概述 在上一章增加linux操作系统空间中已经使用过了mount命令对分区进行挂载,这一章详细介绍挂载管理,该命令涉及的知识点也挺多的而且也还比较重要,是需要掌握的一个 ...
- Copy 与MutableCopy的区别
NSString *string = @"origion"; NSString *stringCopy = [string copy]; NSMutableString *stri ...
- fc-san
在SAN网络中,所有的数据传输在高速.高带宽的网络中进行,SAN存储实现的是直接对物理硬件的块级存储访问,提高了存储的性能和升级能力. 早期的SAN采用的是光纤通道(FC,Fibre Channel) ...
- 使用sklearn做单机特征工程
目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...
- HTTP学习一:HTTP基础知识
1 HTTP介绍 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议. 它的发展是万维网协会(World Wid ...
- JS原生基础终结篇 (帅哥)
闭包 基础 面向对象基础 1.1 闭包 在程序语言中,所谓闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落.这些外部执行域的非 ...
- Mac SVN 设置代理(Proxy)并 Checkout 代码
1. 设置代理 Finder 菜单里面 -> 前往 -> 前往文件夹 -> /Users/username/.subversion -> 编辑文件 servers 在文件的 [ ...