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
    });
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值