数据更新的处理
阅读原文时间:2021年04月21日阅读:1

UpdateModel和TryUpdateModel方法

上 面的模型绑定器支持在你想要生成新的对象,将它们作为参数传递给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>