【问题标题】:angular JS Put method with ASP.NET MVC带有 ASP.NET MVC 的 Angular JS Put 方法
【发布时间】:2015-05-21 00:13:34
【问题描述】:

我为 Put 和 Get 方法定义了这样的角度控制器。我是角度 JS 的新手。 get 方法按预期工作,但未调用 Put 方法。我遵循了其中一个教程并实施了。尽管在教程中,他们使用的是 REST 服务 URL 而不是控制器方法。我在这里使用 MVC 控制器而不是 webAPI 控制器。

public JsonResult GetEmployee(int id)
        {
            Employee empDetail = emp.GetEmployees().FirstOrDefault(i => i.EmpID == id);
            return Json(empDetail, JsonRequestBehavior.AllowGet);
        }


        public JsonResult PutEmployee(int id, Employee updtEmp)
        {
            updtEmp.EmpID=id;
            int index = emp.GetEmployees().FindIndex(i => i.EmpID == updtEmp.EmpID);
            emp.GetEmployees().RemoveAt(index);
            emp.GetEmployees().Add(updtEmp);
            return Json(emp.GetEmployees(), JsonRequestBehavior.AllowGet);
        }

这是我的角度工厂和控制器方法

myservice.factory('empFactory', function ($resource) {

    return $resource('../../Employee/GetEmployee/:EmpID', { EmpID: '@EmpID' },
        {
            show: { method: 'GET' },
            update: { method: 'PUT', params: {  Employee: '@employee' } }
        });
});

myApp.controller('empDetailController', function ($scope, empFactory, $routeParams) {

    $scope.Employee = empFactory.show({ EmpID: $routeParams.EmpID });

    $scope.UpdateEmp = function () {
       // alert($scope.Employee.FirstName);
        var employee=$scope.Employee;
        empFactory.update({ EmpID: $routeParams.EmpID, Employee: employee })
    };
});

【问题讨论】:

  • 嗨,Jasen,我已启用 Put.. 请参考我在以下部分中的评论
  • 您需要使用适当的动词 [HttpPut] 来装饰您的控制器,因为 MVC 控制器不会像 WebAPI 那样将动作名称映射到动词。这意味着您需要使用具有不同 URL 的两个请求来设置您的 Angular 服务,而不是尝试重载单个请求。

标签: asp.net-mvc angularjs angularjs-resource


【解决方案1】:

您在 MVC 控制器中在哪里提到该方法是 PUT,除非您提到方法类型 HttpPut 或 HttpPost 等,否则它们将被视为 HttpGet,在您的 MVC 控制器中将该方法称为 PUT 方法,然后重试。

像这样装饰你的 MVC PUT 方法:

[HttpPut]
public JsonResult PutEmployee(int id, Employee updtEmp)
    {
        updtEmp.EmpID=id;
        int index = emp.GetEmployees().FindIndex(i => i.EmpID == updtEmp.EmpID);
        emp.GetEmployees().RemoveAt(index);
        emp.GetEmployees().Add(updtEmp);
        return Json(emp.GetEmployees(), JsonRequestBehavior.AllowGet);
    }

工厂和控制器应该是这样的:

myservice.factory('empFactory', function ($resource) {
var resource = {
employees:$resource('../../Employee/GetEmployee/:EmpID', { EmpID: '@EmpID' }),
empUpdateService:$resource('../../Employee/PutEmployee/:EmpID', { EmpID: '@EmpID' },{            
        update: { method: 'PUT', params: {  Employee: '@employee' } }
    })
};

 return resource;
});

myApp.controller('empDetailController', function ($scope, empFactory, $routeParams) {

$scope.Employee = empFactory.employees.get({ EmpID: $routeParams.EmpID });

$scope.UpdateEmp = function () {
   // alert($scope.Employee.FirstName);
    var employee=$scope.Employee;
    empFactory.empUpdateService.update({ EmpID: $routeParams.EmpID, Employee: employee })
};

【讨论】:

  • 我已经包含了 put 方法。但我看到的问题是,如果您查看 URL,它直接指向 Get 方法。所以从逻辑上讲,我的想法应该是 function myfactory(methodname) { If methodname==get { give the url and call show method} } return $resource('../../Employee/GetEmployee/:EmpID' ,{ EmpID:'@EmpID'},{显示:{方法:'GET'},更新:{方法:'PUT',参数:{员工:'@employee'}}});但我不知道如何用角码做到这一点
  • 你最好使用 web api 控制器,它们会减少很多工作量,它们会给你干净简单的 URL 来访问你的 REST api。这只是我的建议。
  • 请在回答部分找到我的回复
  • 我也上传了我用过的代码。提前感谢您的回复
  • 答案已更新为工厂和控制器。看看。
【解决方案2】:

您想以一种非常好的方式做到这一点,但为此您应该使用 WEB Api 控制器。

Web Api 控制器应该是这样的:

    public class Employee : ApiController
    {
    public EmpModel GetEmployee(int id)
    {
        Employee empDetail = emp.GetEmployees().FirstOrDefault(i => i.EmpID == id);
        return empDetail;
    }

    public bool PutEmployee(int id, Employee updtEmp)
    {
        updtEmp.EmpID=id;
        int index = emp.GetEmployees().FindIndex(i => i.EmpID == updtEmp.EmpID);
        emp.GetEmployees().RemoveAt(index);
        emp.GetEmployees().Add(updtEmp);
        return emp.PutEmployees(updtEmp);
    }

    public bool PostEmployee(Employee empModel)
    {
        // do something
        return emp.SaveEmployees(empModel);
    }

    public bool DeleteEmployee(int id)
    {
        // do something
        return emp.DeleteEmployees(id);
    }
}

考虑以下资源,它可以执行四个操作。它们是获取、发布、放置和删除。 :

var resource = {
    employee: $resource('../../Employee/:EmpID', { EmpID: '@EmpID' },
       {
           update: { method: 'PUT' },

       });

}
return resource;

在这样的控制器中使用你的资源,获取:

$scope.Employee = empFactory.employee.get({ EmpID: $routeParams.EmpID }).$promise;

发帖:

 $scope.SaveEmp = function (employee) {
empFactory.employee.save({
    EmpID: $routeParams.EmpID,
    Employee: employee
}, function (response) {
    // do something with your success response
})

};

删除:

 $scope.UpdateEmp = function () {
 empFactory.employee.delete({
     EmpID: $routeParams.EmpID
 }, function (response) {
     // do something with your success response
 })

};

更新:

  $scope.UpdateEmp = function (employee) {
  empFactory.employee.update({
      EmpID: $routeParams.EmpID,
      Employee: employee
  }, function (response) {
      // do something with your success response
  })

};

【讨论】:

  • 谢谢.. 我的情况完美,除了它使用不同的 URL。我同意使用 webAPI 是最好的方法。但想在采取这种方法之前解决这个问题,只是为了了解这两种方法。在没有真正解决问题的情况下继续前进是很痛苦的。我不知道为什么 employee.show 不工作,它显示方法未找到
  • 现在问题证明是 Angular JS 工厂方法的问题。我们需要找到一种使用 $resource 的四种不同方法编写工厂的方法
  • 你在控制器中使用的这四种方法,你的工厂将只有资源
  • 然后在我看来,我们不能在 angularjs 工厂中使用四个资源。这我不能放在心上:(:(逻辑上我认为它必须起作用....
  • 你在哪里看到工厂里的四种方法@TechQuery
【解决方案3】:

这是我的服务,包含多个资源语句。它也接近你最初分享的内容

var resource = {
        employee:
            $resource('../../Employee/GetEmployee/:EmpID', { EmpID: '@EmpID' },
           {
               show: { method: 'GET' }

           }),
        empUpdate:
            $resource('../../Employee/PutEmployee/:EmpID', { EmpID: '@EmpID', empval: '@empl' }, { update: { method: 'PUT', isArray: true } }),
        empDelete:
            $resource('../../Employee/DeleteEmployee/:EmpID', { EmpID: '@EmpID' }, { del: { method: 'DELETE', isArray: true } }),

        empCreate:
            $resource('../../Employee/CreateEmployee', { empval: '@empl' }, { create: { method: 'POST', isArray: true } })
    }

    return resource;

现在我有另一个问题,我的 Angular js 视图没有更新,我将它发布在 stackoverflow 中。如果你能帮上忙就好了

Angular JS CRUD update not refreshing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多