我知道这个问题在堆栈溢出上已经被问过很多次了,但我遇到了一些奇怪的事情,并且想了解如何更改它以使其正常工作。
我读到的所有内容都表明,当将对象传回 MVC 时,请确保您的 JSON 参数名称与 C# 的参数名称匹配,并确保 MVC 对象模型相同。当我尝试示例 2 时,我得到 Controller 中对象的空值,但如果我使用示例 1,我会得到所需的数据。
我想使用示例 2,我猜测问题的发生是因为与 WebApiConfig 或 global.asax 有关,希望有人能够澄清。
型号
public class SearchCredential
{
public string Employee { get; set; }
public string CostCenter { get; set; }
}
Controller
[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中post方法的签名是post(url, data, [config])
在第一种方法中,你做得对。即将数据作为对象发布
{"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter }
在第二种方法中,您将上述对象封装在另一个对象中,传递的数据将类似于
{ {"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter } }
asp.net 所做的是,每当请求到来时,它都会匹配可用方法的名称和签名,并使用参数调用该方法。 C# 解析输入参数并将匹配的值分配给匹配的属性名称。
在您的情况下,您有一个 post 方法接受一个具有属性 Employee
和 CostCenter
的对象参数。
在示例 1 中,输入 json 数据为 {"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter }
并将为其分配相应的 C# 变量。
在示例 2 中,数据将被解析为值为 {"employee": vm.searchEmployee,"costCenter": vm.searchCostCenter }
的匿名对象。由于 JSON 中的属性未命名,并且 C# 无法找到相应的位置来赋值,因此输入将为 null。
仅供理解 如果将c#对象声明为公共(public)类,则可以获得该值
SearchCredential
{
public string Employee { get; set; }
public string CostCenter { get; set; }
public SearchCredential credential { get; set; }
}
在这种情况下,您将在第三个属性中获取数据,例如 2
关于javascript - Angular 和 ASP.NET MVC - 后端收到时参数为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124952/