Angular& ASP.NET MVC - 后端接收时参数为null

时间:2015-12-07 01:12:00

标签: javascript c# angularjs json asp.net-mvc

我知道在堆栈溢出时已多次询问过这个问题,但我遇到了一些奇怪的事情,想要了解如何将其更改为正常工作。

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

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

模型

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

控制器

vm.searchCriteria = {"employee": vm.searchEmployee,
                     "costCenter": vm.searchCostCenter
                    };

$http.post(baseURL + 'SearchEmployees', vm.searchCriteria )

Javascript示例1:

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

Javascript示例2:

{{1}}

1 个答案:

答案 0 :(得分:1)

角度为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