我知道这个问题在堆栈溢出时已经被问过很多次了,但是我遇到了一些奇怪的事情,并且想了解如何改变它才能正常工作。

我读到的所有内容都说,在将对象传递回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中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

07-25 23:12