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 ...
随机推荐
- [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM
一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...
- Sublime Text3 Package Control 在菜单栏中不显示
前言 最近由于在 Sublime Text3 下配置了React 开发环境,最近也更新了Sublime Text3 的版本,由此装上了很多的插件.今天打开Sublime 想要通过 `Package C ...
- JDK安装源码src和doc
(1)src 打开JDK的安装目录如(C:\Program Files\Java\jdk1.8.0_91)有一个src.zip的压缩文件,这个压缩文件里就是源码. mkdir src copy src ...
- JS原生第六篇 (帅哥)
复习 按钮不可用 disabled = "disabled" || true setTimeout 只执行一次 setInterval 执行很多次 递归调用 ...
- ExtJs布局详解
序言 1.百度百科上说:ExtJs功能丰富,无人能出其右.无论是界面之美,还是功能之强,extjs都高居榜首. 2.呵呵,界面之美当是少不了布局的,这篇文章我写layout的七种布局.(extjs是4 ...
- Jser 设计模式系列之面向对象 - 接口封装与继承
GOF在<设计模式>中说到:面向接口编程,而非面向实现编程 鉴于此,这个概念可见一斑! JS却不像其他面向对象的高级语言(C#,Java,C++等)拥有内建的接口机制,以确定一组对象和另一 ...
- jQuery源码分析系列:Callback深入
关于Callbacks http://www.cnblogs.com/aaronjs/p/3342344.html $.Callbacks()的内部提供了jQuery的$.ajax() 和 $.Def ...
- jQuery2.0.3源码分析系列(28) 元素大小
最近的分析都是有点不温不火,基本都是基础的回顾了 今年博客的目标目前总的来说有2大块 JS版的设计模式,会用jQuery来诠释 JS版的数据结构,最近也一直在狠狠的学习中. HTML息息相关的的样式 ...
- 推荐21款最佳 HTML5 网页游戏
尽管 HTML5 的完全实现还有很长的路要走,但 HTML5 正在改变 Web,未来 HTML5 将把 Web 带入一个更加成熟和开放的应用平台.现在,越来越多的人尝试用 HTML5 来制作网页游戏等 ...
- 搞清arguments,callee,caller
arguments是什么? arguments是函数调用时,创建的一个类似的数组但又不是数组的对象,并且它存储的是实际传递给函数的参数,并不局限于函数声明的参数列表哦. 尼玛,什么意思? 写个demo ...