ASP.NET Core中地址栏传入数据会影响Controller向ViewModel赋值

news/2024/7/7 18:03:27

今日发现一个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


http://www.niftyadmin.cn/n/4544275.html

相关文章

java实现排序(5)-归并排序

引言 归并排序也是一种效率非常高的排序算法&#xff0c;它的时间复杂度是O&#xff08;NlogN&#xff09;。在本文中&#xff0c;会详细介绍归并排序的概念和排序的基本原理。最后用代码实现归并排序&#xff0c;供大家参考。笔者目前整理的一些blog针对面试都是超高频出现的…

闭包的优点及使用闭包的注意点

一. 闭包的优点&#xff1a; 1&#xff09; 减少全局变量 <script>function f(){var a 0;return function () {a;alert(a);}}var result f();result(); //1result(); //2 </script> 2&#xff09; 减少传递给函数的参数数量 <script>function calFactory(…

java实现排序(6)-快速排序

引言 快速排序&#xff0c;作为一个编程人员来说&#xff0c;肯定都是接触过的。那么&#xff0c;你还记得怎么去实现么&#xff0c;怎么优化呢&#xff1f;在本篇博文中&#xff0c;会详细介绍快速排序的过程&#xff0c;对于不是唯一的过程&#xff08;可变或者可选&#xf…

kerberos配置方法

为什么80%的码农都做不了架构师&#xff1f;>>> 客户端配置 kerberos客户端配置&#xff0c;理论上很简单。安装客户端程序&#xff0c;然后拿到正确的kerberos配置信息&#xff0c;理论上就可以使用kerberos来验证身份了。下面以red hat enterprise server 6.5为例…

java I/O系统(1)-File类

引言 自己对java的IO系统不是非常了解。所以我想进一步一点点去整理好它。在本篇博文中&#xff0c;我们详细介绍一下File类的意义&#xff0c;包括它很大部分的功能。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接&#xff1a;http://blog.csdn.net/u01…

java I/O系统(2)-装饰器模式

引言 IO系统是使用了装饰器模式的典型。所以对装饰器模式的深入研究对IO系统的理解肯定大有裨益。在本文中会详细介绍装饰器模式&#xff0c;会用以demo展示&#xff0c;同时会举出例子在IO系统中是如何呈现了这种模式&#xff0c;最后&#xff0c;我们探讨一下装饰器模式与代…

mysql报错Operand should contain * column解决办法

为什么80%的码农都做不了架构师&#xff1f;>>> 使用了sql语句处理某些内容。当执行某个语句时&#xff0c;Mysql报错误&#xff1a;Operand should contain 1 column 字面意思是&#xff0c;需要有1个数据列。 解决办法&#xff1a;将查询sql的查询结果改为所需的…

java I/O系统(3)-字节流与字符流

引言 在java的IO系统中&#xff0c;对资源的操作分为两类&#xff1a;字节流与字符流。如果延承inputStream与outputStream就是字节流&#xff0c;如果延承reader与writer就是字符流&#xff0c;那么他们之间到底有什么区别呢&#xff1f;在本篇博文中会列出IO系统的所有操作类…