gpt4 book ai didi

c# - UpdateModel() 有什么作用?

转载 作者:可可西里 更新时间:2023-11-01 08:45:41 25 4
gpt4 key购买 nike

通俗地说,UpdateModel()TryUpdateModel()是做什么的?我似乎无法(在 SO 或网络上)找到任何关于它实际做什么的明确解释(用明确的术语),只是人们在使用它时遇到问题。

VisualStudio 的智能感知也没有帮助我。我问的原因是,比方说,如果我的 Controller 中有这个:

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

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

return View(vm);
}

我不是已经通过设置 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);
}

当我检查 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; }
}

最佳答案

当你写的时候会发生什么

public ActionResult Index( UserViewModel vm)
{ }

当您检查 ActionResult 时,您会发现 vm 包含您从 View 发布的值。这是因为 mvc 指示模型绑定(bind)器从不同来源(表单集合、路由值、查询字符串等)提取值并填充模型的值。但是要做到这一点,您的表单键必须与模型中的属性名称匹配,如果是这种情况,您的模型就会正确填充。现在我们来谈谈真正的问题:UpdateModel 做了什么?简单的答案就是模型绑定(bind)。不同之处仅在于您明确地调用了它。上面的ActionResult可以像使用UpdateModel一样改写

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

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

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

如果你不想做这样的事情,请检查这个 google search

关于c# - UpdateModel() 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8600239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com