ASP.NET Core中地址栏传入数据会影响Controller向ViewModel赋值
今日发现一个BUG,经过仔细调试,发现之前没有注意到的一个特性,或者说是很郁闷的一个设定。
需求大致是这样的:1-N个用车账单,可以共同选择出来生成一个报销单,现在要修改报销单。
上部分相关代码,无关代码已剔除。
ViewModel
public class EditViewModel {
[HiddenInput] public int Id { get; set; } }
出问题的Controller
public async Task<IActionResult> EditCar(int id)// 这个id指的是用车账单的id { var accounts = await _service.GetReimburseAccountsByAccountIdAsync<CarAccount>(id); // 根据一个用车账单id查询出在同一个报销单中的所有用车账单 var entity = await _service.FindByIdAsync(accounts.First().ReimburseId.Value); // 用第一个用车账单找出对应的报销单 return View(new EditViewModel<CarAccountViewModel>(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<IActionResult> EditCar(int accountId)// 这个accountId指的是用车账单的id { var accounts = await _service.GetReimburseAccountsByAccountIdAsync<CarAccount>(accountId); // 根据一个用车账单id查询出在同一个报销单中的所有用车账单 var entity = await _service.FindByIdAsync(accounts.First().ReimburseId.Value); // 用第一个用车账单找出对应的报销单 return View(new EditViewModel<CarAccountViewModel>(categories) { Id = entity.Id, // viewmodel中的这个id指的是报销单的id }); }