使用Angularjs $ Http.post,ASP.NET MVC 4 FormCollection为空

时间:2014-07-21 04:53:00

标签: javascript asp.net asp.net-mvc angularjs asp.net-mvc-4

我正在使用 Angularjs(1.2.20) Microsoft ASP.Net MVC 4 提交表单帖子:

public ActionResult Save2(FormCollection customer)
{
   //TODO: Do some stuffs...
   return new HttpStatusCodeResult(HttpStatusCode.OK);
}

但是,FormCollection为空。我知道数据正在发送,因为如果我将其更改为下面的代码(使用强类型CustomerVm),它将按预期工作。

public ActionResult Save1(CustomerVm customer)
{
   //TODO: Do some stuffs...
   return new HttpStatusCodeResult(HttpStatusCode.OK);
}

我正在使用FormCollection,因此我可以在数据中添加 ASP.Net 防伪标记(而不是标头)。以下是我的自定义JavaScript代码。您还可以找到整个代码( Visual Studio here

1 个答案:

答案 0 :(得分:1)

您需要发送内容类型为application/x-www-form-urlencoded的请求,并对请求正文进行编码。这是一个好的开始,但它将数据作为JSON发送。

var data = JSON.stringify(customer);

// FormCollection
$http({
    method: 'POST',
    url: '/Home/Save2',
    //dataType: 'json',
    contentType: 'application/x-www-form-urlencoded; charset-UTF-8',
    //contentType: 'application/json; charset-UTF-8',
    data: data
});

将对象转换为URL编码形式实际上非常复杂。值得庆幸的是,Ben Nadel已经通过请求转换器创建了transformRequestAsFormPost service to do this。您可以尝试添加他的代码并对您进行更改...

myApp.factory('customerSvc', function ($http, transformRequestAsFormPost) {
    return {
        // ...
        save2: function (customer, antiForgeryToken) {
            $http({
                method: 'POST',
                url: '/Home/Save2',
                transformRequest: transformRequestAsFormPost,
                data: data
            });
        }
    };
});