代码之家  ›  专栏  ›  技术社区  ›  Kirschstein

ASP.NET MVC updateModel()方法是如何工作的?

  •  27
  • Kirschstein  · 技术社区  · 16 年前

    我正在开发我的第一个.net mvc应用程序,并使用nerddinner教程作为参考点。我现在感兴趣的一点是 UpdateModel() 方法。(我不喜欢用我不太懂的东西。)

    取自 NerdDinner tutorial -

    //
    // POST: /Dinners/Edit/2
    
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection formValues) {
    
        Dinner dinner = dinnerRepository.GetDinner(id);
    
        UpdateModel(dinner);
    
        dinnerRepository.Save();
    
        return RedirectToAction("Details", new { id = dinner.DinnerID });
    }
    

    我的主要问题是 更新模型() 获取对edit方法中传递的formvalues的访问权限?为什么集合没有显式地作为参数传递给方法?

    3 回复  |  直到 16 年前
        1
  •  28
  •   Jordan    13 年前

    updateModel()是一个控制器帮助器方法,它试图将一堆不同的输入数据源(来自视图的http post数据、querystring值、会话变量/cookies等)绑定到作为参数指示的显式模型对象。本质上,它只用于模型绑定。

    如果您将操作的输入参数表示为强类型模型(如视图模型),那么在调用updateModel()时,您已经在后台执行了所有步骤。如果从datacontext检索对象并编辑其属性,那么savechanges()就是将更新推回到数据库所需的全部内容(在本例中是save())。

    例子:

    //
    // POST: /Dinners/Edit/2
    
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(DinnerViewModel incoming) {
    
        var dinner = dinnerRepository.GetDinner(incoming.DinnerID);
        dinner.Description = incoming.Description;
        dinnerRepository.Save();
    
        return RedirectToAction("Details", new { id = incoming.DinnerID });
    }
    

    然而, 有一个将updateModel()用于强类型模型的用例:当您传入强类型模型并希望其值直接替换数据库中实体的值(前提是它们的名称和类型都相同)。在本例中,您将检索该对象,并对其使用updateModel(),其模型绑定操作将从强类型对象向检索的对象拉入任何类似名称和类型的属性。换句话说,它将执行 反射 为你。

    因此,与您的示例一样,如果希望所有属性都更新而不指定要更新的属性,并且强类型模型和数据库模型具有类似命名的属性,那么您仍然希望使用updateModel()来利用反射。

    例子:

    //
    // POST: /Dinners/Edit/2
    
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(DinnerViewModel incoming) {
    
        var dinner = dinnerRepository.GetDinner(incoming.DinnerID);
        UpdateModel(dinner);
        dinnerRepository.Save();
    
        return RedirectToAction("Details", new { id = incoming.DinnerID });
    }
    

    这里(比使用formcollection对象)的唯一优势是您可以访问强类型对象的所有其他属性(如incoming.dinnerid所示)。

    结论:如果要将强类型对象转换为派生对象,那么使用updateModel()可能是最简单的。但是,如果只是更新派生对象的一些属性,则基本上没有必要。另外,请注意,使用实体框架(而不是像linq to sql这样的东西)会造成所有这些问题,因为它可以将强类型对象和派生对象与其自己的方法关联起来。

        2
  •  4
  •   Andrei Rînea    16 年前

    它检查所有的httprequest输入,比如form、querystring、cookies和服务器变量。我想按这个顺序。

        3
  •  1
  •   Rahul Mahajan    7 年前

    我们不是将模型对象作为参数传递给“post()”操作方法,而是在“post()”函数中创建模型对象的实例,并使用“updateModel()”函数更新它。updateModel()“函数检查所有的httprequest输入,如发布的表单数据、querystring、cookies和服务器变量,并填充employee对象。

    例如

    [HttpPost]
    [ActionName("Create")]
    public ActionResult Create_Post()
    {
            EmployeeBusinessLayer employeeBusinessLayer =
                new EmployeeBusinessLayer();
            Employee employee = new Employee();
            UpdateModel(employee);
            employeeBusinessLayer.AddEmmployee(employee);
            return RedirectToAction("Index");
    }