上 面的模型绑定器支持在你想要生成新的对象,将它们作为参数传递给controller action方法的场景下非常有用。但还有些场景,你想要能够把输入值绑定到在action方法中创建或获取的现有的对象实例上。例如,在对数据库中现有 的产品的编辑场景中,你也许想要在action方法中,先使用ORM从数据库中取得一个现有的产品对象,然后将新的输入值绑定到这个获取的产品实例上,然 后将变动保存回数据库。
第五个预览版在Controller基类中加了2个新的方法,UpdateModel() 和 TryUpdateModel(),来帮助促成这个场景。两者都允许你将一个现有的对象实例作为第一个参数传进去,然后作为第二个参数,你传入你想要使用 表单提交值来更新的属性列表。 例如,下面,我使用LINQ to SQL取得了一个Product对象,然后使用UpdateModel方法来用表单数据更新产品的名称和价格属性。
UpdateModel 方法会试图更新你列出的所有的属性(即使在更新列表前面某个属性时出了错)。如果它在更新一个属性时遇上了错误(例如,你对类型是Decimal的 UnitPrice属性输入了假的字符串数据),它会在一个新的ModelState集合中存储一个抛出的异常对象, 以及原先的表单提交值,这个集合是在第五个预览版中新加的。我们将在稍后讨论这个新的ModelState集合,但简单地说,在出错需要重新显示表单时,它方便我们用用户输入的值自动填充表单,让用户来修改。
在 尝试更新所有列出的属性后,UpdateModel会抛出一个异常,如果其中一个失败了的话。TryUpdateModel的工作原理是一样的,除了不是 抛出一个异常,而是返回一个true/false布尔值,表示更新过程中是否有错外。你可以任意选择与你的错误处理偏好最相合的方法。
通过上一篇的学习 我们已经知道怎么查询关系 这篇就来说说怎么导航属性数据更新时的处理 以及EF又会为我们生成哪些SQL~
老规矩 先看下今天的图
添加和修改页面基本就是这样
这节的内容相对简单~~
主要就是讲 一对一 一对多 多对多时的增删改 以及MVC的一些小东西
一. 一对多的的处理
看第一张图 院系和课程是一对多的关系
1.添加
一对多的添加非常简单 遇到一对多的情况 我们一般考虑dropdownlist来展示 只要把这个展示出来就容易了
mvc绑定dropdownlist 一般是 控制器用 viewstate存一个SelectList 或者viewbag 然后视图绑定 上代码
课程添加控制器
public ActionResult Create()
{
PopulateDepartmentsDropDownList();
return View();
}
// // POST: /Course/Create
\[HttpPost\]
public ActionResult Create(Course course)
{
try
{
// TODO: Add insert logic here if (ModelState.IsValid)
{
db.Courses.Add(course);
db.SaveChanges();
// PopulateDepartmentsDropDownList(course.DepartmentID); }
return RedirectToAction("Index");
}
catch
{
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
return View();
}
}
/// <summary> /// 处理下拉列表 /// </summary> /// <param name="selected">选择的项</param> private void PopulateDepartmentsDropDownList(object selected = null)
{
var departmentsQuery = from d in db.Departments
orderby d.Name
select d;
ViewBag.DepartmentID = new SelectList(departmentsQuery, "DepartmentID", "Name", selected);
}
可以看到 非常简单下面是视图的
视图
@model ContosoUniversity.Models.Course
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Create</h2>