.NET Core MVC中TryUpdateModelAsync报NewArrayInit无效错误求助
解决.NET Core MVC中TryUpdateModelAsync的"NewArrayInit"无效错误
你遇到的错误是因为调用TryUpdateModelAsync时,传入的lambda表达式使用了数组初始化(new object[] { ... }),而该方法仅支持单个成员访问的表达式作为属性筛选条件,不支持数组初始化节点(NewArrayInit)。
以下是两种可行的解决方案:
方案1:使用字符串数组指定要更新的属性
将lambda表达式替换为字符串数组,直接列出需要更新的属性名称:
[HttpPost,ActionName("Edit")] [ValidateAntiForgeryToken] public async Task<ActionResult> EditLocaton([ModelBinder(typeof(EncryptDataBinder))]int id, IFormCollection formCollection) { ModelState.Clear(); LocationModel location = new LocationModel(); try { // 用字符串数组指定要更新的属性 await TryUpdateModelAsync<LocationModel>(location, "", new[] { "ID", "Name", "Code", "RowVersion" }); // 后续的模型保存逻辑 } catch (Exception ex) { // 异常处理逻辑 throw; } // 返回对应视图或结果 }
方案2:传入多个单独的成员访问表达式
TryUpdateModelAsync支持传入多个独立的lambda表达式,每个表达式对应一个要更新的属性:
[HttpPost,ActionName("Edit")] [ValidateAntiForgeryToken] public async Task<ActionResult> EditLocaton([ModelBinder(typeof(EncryptDataBinder))]int id, IFormCollection formCollection) { ModelState.Clear(); LocationModel location = new LocationModel(); try { // 每个属性用单独的lambda表达式指定 await TryUpdateModelAsync<LocationModel>(location, "", p => p.ID, p => p.Name, p => p.Code, p => p.RowVersion); // 后续的模型保存逻辑 } catch (Exception ex) { // 异常处理逻辑 throw; } // 返回对应视图或结果 }
原理说明
TryUpdateModelAsync的表达式重载要求每个参数都是单个成员访问表达式(如p => p.Name),用来明确指定要从表单绑定的属性。你之前的写法生成了数组初始化节点,不符合方法的参数校验规则,因此触发了错误提示。
内容的提问来源于stack exchange,提问作者JagathNalin
相关产品推荐
相关产品推荐

