使用复杂数据类型的集合调用 UpdateModel 会重置所有非绑定值吗?

2024-02-24

我不确定这是否是 DefaultModelBinder 类中的错误或什么。 但 UpdateModel 通常不会更改模型的任何值,除了找到匹配的值之外。 看看以下内容:

[AcceptVerbs(HttpVerbs.Post)]
public ViewResult Edit(List<int> Ids)
{
    // Load list of persons from the database
    List<Person> people = GetFromDatabase(Ids);
    // shouldn't this update only the Name & Age properties of each Person object
    // in the collection and leave the rest of the properties (e.g. Id, Address)
    // with their original value (whatever they were when retrieved from the db)
    UpdateModel(people, "myPersonPrefix", new string[] { "Name", "Age" });
    // ...
}

发生的事情是 UpdateModel 创建newPerson 对象,从 ValueProvider 分配其 Name 和 Age 属性并将它们放入参数 List 中,这使得其余属性设置为其默认初始值(例如 Id = 0) 那么这是怎么回事呢?


UPDATE:我单步浏览了mvc源代码(特别是DefaultModelBinder类),这是我发现的:

该类确定我们正在尝试绑定一个集合,因此它调用该方法:UpdateCollection(...)这创造了一个内在的ModelBindingContext有一个null Model财产。然后,将该上下文发送到该方法BindComplexModel(...)它检查Model财产为null并创建一个new模型类型的实例(如果是这种情况)。

这就是导致值被重置的原因。

因此,只有通过表单/查询字符串/路由数据传入的值才会被填充,其余的仍保持其初始化状态。

我能够做很少的改变UpdateCollection(...)解决这个问题。

这是我更改的方法:

internal object UpdateCollection(ControllerContext controllerContext, ModelBindingContext bindingContext, Type elementType) {
IModelBinder elementBinder = Binders.GetBinder(elementType);

// build up a list of items from the request
List<object> modelList = new List<object>();
for (int currentIndex = 0; ; currentIndex++) {
    string subIndexKey = CreateSubIndexName(bindingContext.ModelName, currentIndex);
    if (!DictionaryHelpers.DoesAnyKeyHavePrefix(bindingContext.ValueProvider, subIndexKey)) {
        // we ran out of elements to pull
        break;
    }
    // **********************************************************
    // The DefaultModelBinder shouldn't always create a new
    // instance of elementType in the collection we are updating here.
    // If an instance already exists, then we should update it, not create a new one.
    // **********************************************************
    IList containerModel = bindingContext.Model as IList;
    object elementModel = null;
    if (containerModel != null && currentIndex < containerModel.Count)
    {
        elementModel = containerModel[currentIndex];
    }
     //*****************************************************
    ModelBindingContext innerContext = new ModelBindingContext() {
        Model = elementModel, // assign the Model property
        ModelName = subIndexKey,
        ModelState = bindingContext.ModelState,
        ModelType = elementType,
        PropertyFilter = bindingContext.PropertyFilter,
        ValueProvider = bindingContext.ValueProvider
    };
    object thisElement = elementBinder.BindModel(controllerContext, innerContext);

    // we need to merge model errors up
    VerifyValueUsability(controllerContext, bindingContext.ModelState, subIndexKey, elementType, thisElement);
    modelList.Add(thisElement);
}

// if there weren't any elements at all in the request, just return
if (modelList.Count == 0) {
    return null;
}

// replace the original collection
object collection = bindingContext.Model;
CollectionHelpers.ReplaceCollection(elementType, collection, modelList);
return collection;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用复杂数据类型的集合调用 UpdateModel 会重置所有非绑定值吗? 的相关文章

  • 发送 POST 请求时 JSON 原语无效

    我有以下 ajax 请求 其中我尝试将 JSON 对象发送到服务器 function sendData subscriptionJson ajax type POST url Url Action SubscribeSecurities S
  • asp.net mvc html 属性没有值

    我正在尝试根据 HTML5 规范创建一个隐藏表单 其中隐藏属性在没有值的情况下使用 现在我不知道如何将其强制到 asp net mvc 中 上面的方法不能编译 Compiler Error Message CS0103 The name h
  • 将 ninject 与 Ninject.Web.Api 用于 Web Api 2 一起使用在 ASP.NET MVC 5 中不起作用

    我正在开发一个 Asp NET MVC 项目 我的项目也有 web api 我正在使用 ASP NET MVC5 和 Web Api 2 以及 Visual Studio 3 我正在使用 ninject 进行依赖项注入 我知道 ninjec
  • ASP.NET 会话状态和多个工作进程

    我需要了解一些有关 ASP NET 会话状态的信息 因为它适用于 IIS 7 和 ASP net 3 5 如果应用程序配置为使用进程内会话状态 那么如果有多个工作进程 该应用程序是否可以正常工作 换句话说 工作进程是否共享会话状态 IIS
  • 在 VS 2012 中创建并运行 MVC 5 项目

    由于某种原因 我的 Visual Studio 2013 预览版无法创建 MVC 5 项目 由于 MVC 项目现已在 CodePlex 中开源 我想知道是否有一种简单的方法可以在我的 Visual Studio 2012 Ultimate
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 我的 Razor 视图中出现奇怪的自动命名空间导入

    今天我注意到 例如 System 和 System Web Security 已导入到我的所有 razor 视图中 尽管我没有主动导入它们 我检查了 using指令 web config 编辑 也是全局 web config 添加全局导入
  • MVC3 中的“方法‘LabelFor’没有重载需要 2 个参数”

    我正在运行 ASP NET MVC 3 并且正在查看模型的编辑视图 我有一个FullName我想呈现为 全名 的属性 这是有问题的行 div class display label div 现在智能感知shows存在重载 有两个签名 第一个
  • 临时数据持久化

    我一直在与TempData最近面临一个令人困惑的案例 假设TempData在以下操作中创建 public ActionResult MyAction1 myTempData TempData myTempData 预计将在以下 Action
  • 将视图文件作为资源嵌入二进制文件中

    我正在尝试创建一个带有少量控制器的 Net 库 并且我想在多个 Web 项目中重用它们 我已经完成一半了 但我遇到的问题是 每当我将库添加到新的 Web 项目时 我需要将所有相应的视图文件单独复制到新项目中 每当我更新库时 我都需要再次重复
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • ASP.NET Identity:使用角色授权属性在 Azure 上不起作用

    我刚刚在 Azure 上发布了带有 Identity 和 OWIN 授权的新 ASP NET MVC 网站 前端工作得很好 但后端有问题 我在管理控制器中使用 Authorize 属性来检查用户是否具有访问它所需的角色 如下所示 Autho
  • 防止更新 ASP.NET MVC 和实体框架中未更改的值

    我正在使用 ASP NET MVC 和实体框架 我有一个 编辑人员 网页 可以在其中编辑人员的字段 然后在回发操作中 我使用以下代码 var person objectCtx Persons Where s gt s Id id First
  • 使用 Razor View Engine 将内容从部分视图 ASP.NET MVC 3 注入特定部分

    我在我的中定义了此部分 Layout cshtml RenderSection Scripts false 我可以轻松地从视图中使用它 section Scripts Stuff comes here 我正在努力解决的是如何从部分视图中注入
  • vuejs 模板和 asp.net 部分视图,好的做法吗?

    我在网站中使用 Vue js 并将模板添加到 html 代码中 并将 js 代码添加到单个 js 文件中 所以我不想使用 vue Vuefy Browserfy 方法 而是稍后捆绑并缩小我的 js 文件 由于我必须使用 Asp Net MV
  • MVC 3 布局页面、Razor 模板和 DropdownList

    我想在我的网站的所有页面上包含年份的下拉列表 我认为放置此逻辑的好地方是布局页面 layout cshtml 如果用户更改年份 我想更改我的年份会话 ModelBinder 也进行更改 这对于 ASP NET Web 表单来说很容易做到 但
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 具有 OpenId Connect 的 WSO2 身份服务器

    我正在尝试将 WSO2 Identity Server 5 1 0 与 Asp Net MVC 结合使用 作为概念证明 我在 Visual Studio 2015 中创建了一个示例 asp net MVC 项目 按照 WSO2 指南 我已根
  • ReportViewer 正在阻止其他功能,直到报告查看器加载完成

    这是 ReportViewer 控件
  • 表单帖子上的 asp.net mvc 编码

    我在我的 asp net mvc 表单 带有文本区域的 nicedit 中使用富文本编辑器 当我在帖子上提交表单时 因为它不是 html 编码的 我收到以下消息 从客户端检测到潜在危险的 Request Form 值 如何对 post 上的

随机推荐

  • 使用 ASIO 的线程池 - 线程退出,任务未执行

    我正在使用 Boost ASIO 用 C 编写一个 ThreadPool 类 以下是我迄今为止编写的代码 线程池类 using namespace std using namespace boost class ThreadPoolClas
  • 如何计算多标签分类的 F1-Score?

    我尝试计算f1 score但当我使用 sklearn 时 我在某些情况下收到一些警告f1 score method 我有一个多标签 5 类预测问题 import numpy as np from sklearn metrics import
  • 在 delphi 7.0 中创建打包结构时出现错误 EStackOverflow

    在 Borland Delphi 7 0 中创建打包结构时出现 EStackOverflow 我想做以下事情 Type T4 packed record VT integer SKT byte end T3 packed record O
  • 为什么 emplace_back() 不使用统一初始化?

    以下代码 include
  • Javascript 数组计数与控制台不一致? [复制]

    这个问题在这里已经有答案了 我在这里是不是很傻 我来自 Ruby 所以我可能缺少一些有关 Javascript 数组的内容 console log new devices 控制台结果 Array 1 console log new devi
  • 从嵌入资源加载模板

    如何将嵌入资源作为 ITemplate 加载 LoadTemplate 方法仅采用字符串虚拟路径 显然这不适用于嵌入式资源 假设您的模板是嵌入的并且需要保持这种方式 我认为您可能需要重新考虑 这是我不久前编写的一个函数 在处理嵌入文件 主要
  • EF6 防止不在外键上创建索引

    我在用着EF6创建数据库的代码优先方法 当我添加迁移和更新数据库时 它总是创建Non cluster Index默认情况下 对于表中的每个外键 我的问题 是否有 EF6 不创建的全局设置Non Cluster index在外键上 我搜索并找
  • 按组对变量进行排名 (dplyr)

    我有一个包含列的数据框x1 x2 group我想生成一个带有额外列的新数据框rank这表明了顺序x1在其组中 有一个相关问题here https stackoverflow com questions 28018933 r data fra
  • Office集成(Word)-拦截保存

    我计划实施一个小型内部文档管理系统 它必须有一个 Web GUI 用于管理存储在数据库中的远程文件夹结构 这些文件夹中存储了 Word 文档 物理上作为数据库中的 blob 每当用户单击文档链接时 就会通过浏览器下载单词二进制文件 并 希望
  • 使用 JSF Datatable 有条件地显示行

    我有一些当前有效的 JSF 代码 如下所示 我需要修改它以有条件地抑制表中某些行的显示 我知道如何有条件地抑制特定单元格的显示 但这似乎会创建一个空单元格 而我想做的是根本不显示该行 有什么建议么
  • 理论:压缩算法可以使某些文件变小但不会变大?

    我遇到了这个问题 无损压缩算法声称可以保证使某些文件变小并且不会使文件变大 这是 a 不可能 b 可能 但可能运行不确定的时间 c 压缩系数为 2 或更低时可能 d 对于任何压缩因子都可能吗 我倾向于 a 但无法给出具体原因 我将列出我和朋
  • 如何使用相对路径而不包含上下文根名称?

    要工作我的静态文件 CSS JS 我必须编写绝对路径 例如 AppName templates style main css 有没有什么解决方案 我可以写相对路径style main css If your actual关注的是 webap
  • Twitter URL 中的 (#!) 有何作用? [复制]

    这个问题在这里已经有答案了 可能的重复 Facebook 和新 Twitter 网址中的 shebang 有何用途 https stackoverflow com questions 3009380 whats the shebang in
  • XPT 到 CSV 的转换? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也许这是错误的地方 但我不太确定该把它放在哪里 我有一个非常大的 XPT 格式的压缩 SAS 文件 我
  • Reflection.Emit.ILGenerator 异常处理“离开”指令

    首先 一些背景信息 我正在为学校项目制作编译器 它已经在工作了 我正在花费大量的精力来修复错误和 或优化它 我最近遇到的一个问题是我发现 ILGenerator 对象生成了一个额外的leave当您调用以下任何成员方法时的说明 BeginCa
  • 使用 CSS 垂直对齐锚点内的图像

    我想垂直对齐锚元素内的图像 如下所示 ul class thumbnails li class span2 a href class thumbnail img src http www forodefotos com attachment
  • Ballerina,使用 REST-API 的 Json 响应

    我的教授希望我写一个关于如何部署 Ballerina 服务的小教程 所以我正在努力学习它 我正在使用 1 2 版 并且我对污点检查和变量类型的概念有点不知所措 我正在尝试编写一个最小的 REST Service 其端点从另一个 api 请求
  • Swift NSURLConnection sendSynchronousRequest

    在 Objective C 中 可以使用以下语法 NSHTTPURLResponse response nil NSData returnData NSURLConnection sendSynchronousRequest request
  • 找不到 com.android.support:multidex-instrumentation:27.1.1

    我按照说明进行操作https developer android com studio build multidex https developer android com studio build multidex 这是我的错误代码 任务
  • 使用复杂数据类型的集合调用 UpdateModel 会重置所有非绑定值吗?

    我不确定这是否是 DefaultModelBinder 类中的错误或什么 但 UpdateModel 通常不会更改模型的任何值 除了找到匹配的值之外 看看以下内容 AcceptVerbs HttpVerbs Post public View