2015-05-18 38 views
2

我有我的角度控制器像Put和Get方法這樣定義。我新來角JS。 get方法按預期工作,但Put方法沒有被調用。我遵循教程之一併實施。儘管在教程中,他們使用REST服務URL而不是控制器方法。我在這裏使用MVC控制器而不是webAPI。角JS使用ASP.NET MVC的Put方法

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 }) 
    }; 
}); 
+0

你有[在IIS中啓用PUT爲ASP.NET MVC(http://stackoverflow.com/questions/12440277/how-do-i-enable-http -put-和刪除換ASP淨MVC功能於IIS)? – Jasen

+0

嗨Jasen,我已啓用Put ..請參閱以下部分中的我的評論 – TechQuery

+0

由於MVC控制器不會像WebAPI那樣將動作名稱映射到動詞,因此您需要用適當的動詞'[HttpPut]'來修飾控制器。這意味着您需要使用兩個具有不同URL的請求來設置角度服務,而不是試圖超載一個請求。 – Jasen

回答

2

你在哪裏在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); 
    } 

,工廠和控制器shouldBe這樣這樣的:

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 }) 
}; 
+0

我已經包含put方法。但我看到的問題是,如果您查看URL,它將直接指向Get方法。因此,邏輯思維是什麼即時通訊,它應該像 功能myfactory(方式) { 如果方法名==獲得 {把它的URL和呼叫顯示方法} } 回報$資源(」 ../ ../Employee/GetEmployee/:EmpID',{EmpID:'@EmpID'}, { show:{method:'GET'}, update:{method:'PUT',params:{Employee:'@僱員'}} }); 但我不知道如何在角碼 – TechQuery

+0

我剛更新答案,檢查一次。 – Konammagari

+0

您最好使用web api控制器,他們會減少很多努力,他們會給你乾淨,簡單的URL來訪問你的REST api。這只是我的建議。 – Konammagari

1

你想要做一個很好的方法,但是對於你應該使用WEB Api控制器。

網絡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; 

使用你的資源在這樣的控制器,對於GET:

$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 
    }) 

};

+0

謝謝..我的條件工作完美,除了事實,它使用不同的URL。我同意使用webAPI是最好的方法。但想在採取這種方法之前解決這個問題只是爲了瞭解這兩種方法。如果沒有真正解決這個問題,它會很痛苦。我不知道爲什麼employee.show不工作,它顯示方法沒有找到 – TechQuery

+0

現在問題變成了角JS工廠方法的問題。我們需要使用$ resource – TechQuery

+0

找出一種用四種不同的方法編寫工廠的方法。您在控制器中使用的四種方法,您的工廠將只有資源 – Konammagari

0

這是我的多個資源語句的服務。它靠近你已經初步共享以及

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; 

現在我有我的角度JS的看法沒有更新的另一個問題,我張貼的計算器。如果你幫助將是巨大的

Angular JS CRUD update not refreshing