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 ...
随机推荐
- java中文乱码解决之道(八)-----解决URL中文乱码问题
我们主要通过两种形式提交向服务器发送请求:URL.表单.而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面.通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了.不 ...
- ASP.NET MVC 控制器激活(二)
ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...
- 干货!表达式树解析"框架"(1)
最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 关于我和表达式树 其实我也没有深入了解表达式树一些内在实现的原理 ...
- Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
<Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...
- 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机
本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: B ...
- HTTP学习二:Web应用中的HTTP
1 HTTP连接 1.1 TCP连接对性能的影响 TCP三次握手如下图: 如上图,建立一次TCP连接要经过三个步骤.HTTP是建立在TCP之上的,因此TCP连接的性能直接影响HTTP的性能. TCP影 ...
- 谈谈php里的DAO Model AR
这次要谈的3个关键字:DAO.Model.AR,是我们在做web应用时常见的几个概念,也被称作设计模式(design pattern),先简单看看它们的全拼和中文: DAO:Data Access O ...
- VS中行号对齐的辅助线(虚线)去除
3张图 2 3
- OPEN CASCADE Curve Continuity
OPEN CASCADE Curve Continuity eryar@163.com Abstract. 设计一条复杂曲线时,出于设计和制造上的考虑,常常通过多段曲线组合而成,这就需要解决曲线段之间 ...
- [汇编与C语言关系]5. volatile限定符
现在研究一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符.首先看下面的C程序: /* artificial device registers */ unsigne ...