UpdateModel()做什么?

Sal*_*mer 11 c# asp.net-mvc updatemodel

用外行人的话说,做什么,UpdateModel()做什么TryUpdateModel()?我似乎无法找到(在SO或网络上)任何明确的解释它实际上做了什么(用明确的术语),只是有人使用它有问题.

VisualStudio的intellisense也没有帮助我.我问的原因是,因为,如果我在我的控制器中有这个:

[HttpPost]
public ActionResult Index( UserViewModel vm, FormCollection form)
{    
  var statesCheckBoxes = form["StatesList"];       

  vm.BA.StatesTraveledTo = statesCheckBoxes.Split(',').ToList<string>();

  return View(vm);
}
Run Code Online (Sandbox Code Playgroud)

我不是已经通过设置更新我的模型了vm.BA.StatesTraveledTo吗?为什么我需要运行UpdateModel?此外,当我实际尝试执行以下操作时:

[HttpPost]
public ActionResult Index( UserViewModel vm, FormCollection form)
{    
  var statesCheckBoxes = form["StatesList"];       

  vm.BA.StatesTraveledTo = statesCheckBoxes.Split(',').ToList<string>();

  UpdateModel(vm); // IS THIS REDUNDANT TO THE PREVIOUS LINE?

  return View(vm);
}
Run Code Online (Sandbox Code Playgroud)

当我检查ModelState的值时(在我运行UpdateModel()之后),似乎没有发生任何事情,我没有看到任何迹象表明有任何改变.我没有在ModelState字典中看到新密钥.

真的很困惑.谢谢!

编辑:

发布ViewModel和Model类的源代码:

public class UserViewModel
{
  public BankAccount BA { get; set; }
}

public class BankAccount
{
  public Person User { get; set; }
  public List<string> StatesTraveledTo { get; set; }
}

public class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Muh*_*hid 7

你写的时候会发生什么

public ActionResult Index( UserViewModel vm)
{    }
Run Code Online (Sandbox Code Playgroud)

当你检查时,ActionResult你发现它vm包含你从视图中发布的值.这是因为mvc指示模型绑定器从不同的源(表单集合,路由值,查询字符串等)中提取值并填充模型的值.但是为了实现这一点,您的表单键必须与模型中的属性名称匹配,如果是这种情况,则表明您的模型已正确填充.现在我们来看实际的问题:UpdateModel做了什么?简单的答案只不过是模型绑定.区别仅在于您明确地称之为.上面的内容ActionResult可以像使用UpdateModel一样重写

Public ActionResult Index ()
{
   UserViewModel vm = new UserViewModel();
   UpdateModel(vm);// it will do same thing that was previously handled automatically by mvc
}
Run Code Online (Sandbox Code Playgroud)

现在,自动模型绑定未处理的内容也不会由显式模型绑定处理,因为它不是模型绑定器的问题,而是你的html问题.对于像你这样的嵌套视图模型,表单字段名称必须精心设计,以便mvc可以正确地将其注入模型,而无需编写类似的东西

vm.BA.StatesTraveledTo = statesCheckBoxes.Split(',').ToList<string>(); 
Run Code Online (Sandbox Code Playgroud)

如果你不想做这样的事情,请检查这个谷歌搜索