博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core中地址栏传入数据会影响Controller向ViewModel赋值
阅读量:6693 次
发布时间:2019-06-25

本文共 1431 字,大约阅读时间需要 4 分钟。

今日发现一个BUG,经过仔细调试,发现之前没有注意到的一个特性,或者说是很郁闷的一个设定。

需求大致是这样的:1-N个用车账单,可以共同选择出来生成一个报销单,现在要修改报销单。

上部分相关代码,无关代码已剔除。

ViewModel

public class EditViewModel{
  [HiddenInput] public int Id { get; set; }}

出问题的Controller

public async Task
EditCar(int id)// 这个id指的是用车账单的id{ var accounts = await _service.GetReimburseAccountsByAccountIdAsync
(id); // 根据一个用车账单id查询出在同一个报销单中的所有用车账单 var entity = await _service.FindByIdAsync(accounts.First().ReimburseId.Value); // 用第一个用车账单找出对应的报销单 return View(new EditViewModel
(categories) { Id = entity.Id, // viewmodel中的这个id指的是报销单的id });}

出错时,为了书写方便,在action参数直接使用了id。由于配置了默认路由,此时访问id为3的用车账单的编辑报销单的网页的网址为controller/EditCar/3。

测试数据中,有一个id=3和一个id=6的用车账单与一个id=1的报销单相关联。测试时发现,网页中的input标签中的id(EditViewModel.Id)一直与网址中的id参数相同,经测试,action中的代码无误。

由此,我断定一定是cshtml文件在生成最后网页时将网址中的id值赋值到了网页中的input标签中,于是我修改了action参数的名称,问题得以解决!

无误的Controller

public async Task
EditCar(int accountId)// 这个accountId指的是用车账单的id{ var accounts = await _service.GetReimburseAccountsByAccountIdAsync
(accountId); // 根据一个用车账单id查询出在同一个报销单中的所有用车账单 var entity = await _service.FindByIdAsync(accounts.First().ReimburseId.Value); // 用第一个用车账单找出对应的报销单 return View(new EditViewModel
(categories) { Id = entity.Id, // viewmodel中的这个id指的是报销单的id });}

转载于:https://www.cnblogs.com/wzhao666/p/7193473.html

你可能感兴趣的文章
百度研发面经
查看>>
深度解析 Go 语言中「切片」的三种特殊状态
查看>>
ES6 - 函数扩展
查看>>
Linux中apt与apt-get命令的区别与解释(转)
查看>>
原生js 类名操作 增加 删除
查看>>
iOS 中多音频处理
查看>>
java.lang.IllegalStateException: aidl is missing
查看>>
js的数组和对象的多种"复制"和"清空", 以及区分JS数组和对象的方法
查看>>
爬虫提交form表单中含有(unable to decode value)解决方法
查看>>
Vagrant (二) - 日常操作
查看>>
PHP常用180函数总结
查看>>
React 中的事件处理
查看>>
.NET环境大规模使用OpenTracing
查看>>
js 快速排序
查看>>
Sentry的使用
查看>>
如何在微服务架构中对资源(前端页面+后端接口)进行权限控制
查看>>
原生 js 实现面对对象版瀑布流
查看>>
逝去的2018年,年度总结
查看>>
链客区块链技术面试题目专题(二)
查看>>
你的like语句为啥没索引?
查看>>