使用 angularjs v 1.3 发布数据

Posting data with angularjs v 1.3

我有一个 web api 2.0 应用程序,我必须 post 表单数据。这是我的 js 代码:

(function (angular) {
    var public_area = angular.module("public-area", ['ngResource']);

    public_area.factory("MyService", function ($resource) {
        return {
            my_controller: $resource("/api/MyHttpControllerTest/")
        };
    });

    public_area.controller("MyController", function ($scope, MyService) {
        $scope.getPlans = function ()
        {
            var pianiTariffari =
                new MyService
                    .my_controller
                    .query({
                        customerType: $scope.customerType
                    }, isArray = true);
        }

        $scope.sendInvitation = function ( )
        {
            var invitation =
                 new MyService
                    .my_controller(
                        {
                            request: {
                                CustomerType: "test"
                            }
                        });

            invitation.$save();
        }
    });
})(angular);    

你怎么看,我有一个控制器..和两个函数,1 个在 GET 中,1 个在 POST...

我看到你也是服务器端控制器

public FillFormPresentaUnAmicoResponse GetPromozioni(string customerType)
    {
        ...
    }

    [HttpPost]
    public PresentaUnAmicoResponse InvitaAmico(PresentaUnAmicoRequest request)
    {
        ...
    }

class PresentaUnAmicoRequest 是

public class PresentaUnAmicoRequest
{
    public string CustomerType { get; set; }
}

GET 函数运行正常!但是 POST 不是... 在 post 中,我收到了 "request" 的有效实例,但其中的 属性 是 NULL...

对我来说真正奇怪的是,如果我这样调用Post方法:

var invitation = new MyService.my_controller(undefined);
invitation.$save();

服务器端,"request" 是实例化的..我期望 "request = null" 而不是..

谁能帮帮我? 谢谢

更新:

如果我理解,我需要始终使用相同的对象来坚持 REST 原则。因此,根据 spike 的示例,我相信我必须创建一个类似于此的对象:

public class Promos
{
   public string CustomerType{ get; set; }
   public List<string> PromoPerCustomerType{ get; set; }
}

public class PresentaAmico 
{
    public Promos Promozioni { get; set; }
    public string Name{ get; set; }
    public string Surname { get; set; }
    ...
}

而我的休息服务应该是这样的

[HttpGet]
public PresentaAmico Get(string customerType)
{
     ...
}

[HttpPost] 
public void Save(PresentaAmico myForm)
{
     ...
}     

是否正确?

恕我直言,这不是 $resouce 最佳工作方式,那是因为您没有真正遵守 REST 原则。 $resource 的想法是获取一个对象,修改它然后再次 $save 它,它映射到 GET 和 POST 调用,其中返回和正在发送的对象是相同的。

您正在获取 FillFormPresentaUnAmicoResponse 并POST获取另一种类型的对象,即 PresentaUnAmicoResponse。

这当然可以开始整个讨论您是否正在使用 REST,因为它可以与 WebAPI 一起使用:即资源,您可以通过在其上映射 HTTP 动词来修改它(GET/POST 等)您的控制器并没有真正遵守这些规则,因为您通过网络发送不同类型的对象。

所以我实际上会推荐 2 个控制器,每个类型一个:FillFormPresentaUnAmicoResponseController 和 PresentaUnAmicoResponseController。在这种情况下,我还会重新考虑命名 - 'response' 后缀没有必要。

var presenta = $resource('/presentaunamicoresponse/:id', { id:'@id'});
// The id doesn't make any sense here - which should raise the question on
// whether these stuff is really suitable for REST or whether you are really
// doing a remote procedure call, but OK.
presenta.CustomerType = 'Whatever';
presenta.$save();

我想这就是它的工作方式。为了保持一致性,您必须将其粘贴在工厂中。但是正如您在文档 ( https://docs.angularjs.org/api/ngResource/service/$resource ) 中看到的那样 - 您可以获得资源,并在资源本身上操作属性。然后调用 $save() 方法。