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并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)
一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...
- 同步博客到CSDN
经过一些朋友的多次邀请,现同步博客到CSDN,地址:http://blog.csdn.net/knightswarrior.
- eclipse启动时报告错误:Java was started but returned exit code=-805306369
这两天也没改过eclipse和java的配置,但eclipse启动时报告错误:Java was started but returned exit code=-805306369 后来在eclipse ...
- 《Entity Framework 6 Recipes》中文翻译系列 (17) -----第三章 查询之分页、过滤和使用DateTime中的日期部分分组
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-12 分页和过滤 问题 你想使用分页和过滤来创建查询. 解决方案 假设你有如图3 ...
- 2013 duilib入门简明教程 -- 自绘标题栏(5)
如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦. duilib其实并没有区 ...
- oracle 备份数据库对象(存储过程PROCEDURE,FUNCTION,VIEW,TRIGGER...)
开发过程中,需要不停的备份数据库对象, 特别是存储过程, 每次手动备份不免很低能啊 历经几次修改终于, 完美了,O(∩_∩)O哈哈~ (当然,你也可以再改简便一点~~~) select db ...
- Android笔记——SQLiteOpenHelper类
public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...
- Spring学习记录(八)---Bean的生命周期
之前说过,在调用下面时,就创建了容器和对象 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml&quo ...
- Sql Server系列:Update语句
1 UPDATE语法结构 [ WITH <common_table_expression> [...n] ] UPDATE [ TOP ( expression ) [ PERCENT ] ...