Angular&;ASP.NET MVC-当后端接收到参数时,该参数为null

本文关键字:参数 null 端接 amp ASP NET MVC- Angular | 更新日期: 2023-09-27 18:25:50

我知道关于堆栈溢出的问题已经问过很多次了,但我遇到了一些奇怪的问题,我想知道如何将其更改为正常工作。

我读到的所有内容都说,当将对象传递回MVC时,请确保您的JSON参数名称与C#的名称匹配,并确保MVC对象模型是相同的。当我尝试示例2时,我会得到控制器中对象的空值,但如果我使用示例1,我会获得所需的数据。

我想使用示例2,我猜问题的发生是因为WebApiConfig或global.asax的问题,我希望有人能澄清。

型号

public class SearchCredential
{
    public string Employee { get; set; }
    public string CostCenter { get; set; }
}

控制器

[HttpPost]
public dynamic SearchEmployees(SearchCredential searchCriteria)
{
   // some code goes here   
}

Javascript示例1:

vm.searchCriteria = {"employee": vm.searchEmployee,
                     "costCenter": vm.searchCostCenter
                    };
$http.post(baseURL + 'SearchEmployees', vm.searchCriteria )

Javascript示例2:

vm.searchCriteria = {"employee": vm.searchEmployee,
                     "costCenter": vm.searchCostCenter
                    };
$http.post(baseURL + 'SearchEmployees', { searchCriteria: vm.searchCriteria })

Angular&;ASP.NET MVC-当后端接收到参数时,该参数为null

angular中post方法的签名为post(url, data, [config])

在第一种方法中,你做得对。即将数据作为对象发布

{"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter }

在第二种方法中,您将上述对象封装在另一个对象中,传递的数据将类似

{ {"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter } }

asp.net所做的是,每当收到请求时,它都会匹配可用方法的名称和签名,并使用参数调用该方法。C#解析输入参数,并将匹配的值分配给匹配的属性名称。在您的例子中,您有一个post方法,它接受一个属性为EmployeeCostCenter的对象参数。

在示例1中,输入json数据是{"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter },它将被分配相应的C#变量。

在示例2的情况下,数据将被解析为值为{"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter }的匿名对象。由于JSON中的属性是未命名的,并且C#找不到相应的位置来分配值,因此输入将为null。

只是为了理解如果您将c#对象声明为公共类,则可以获得该值

SearchCredential
{
    public string Employee { get; set; }
    public string CostCenter { get; set; }
    public SearchCredential credential { get; set; }
}

在这种情况下,您将在第三个属性中获得数据,例如2