#c# #angularjs #asp.net-mvc
#c# #angularjs #asp.net-mvc
Вопрос:
Я хочу создать пользовательский метод в контроллере Api и вызвать его из AngularJS $ http.(get / post). У меня есть view .cshtml, где я использую ng-repeat для получения данных из базы данных, приведенной ниже..
Теперь я хочу создать пользовательский метод в web api для обновления только 1 поля (статус = 1), когда администратор нажимает кнопку Утвердить
мой контроллер Api :
using AttributeRouting;
using AttributeRouting.Web.Mvc;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
namespace HRM_Project.Controllers
{
[RoutePrefix("api/EmployeeLeaveApi")]
public class EmployeeLeaveApiController : ApiController
{
private HRM27Entities db = new HRM27Entities();
// GET api/EmployeeLeaveApi
public IEnumerable<EmployeeLeave> GetEmployeeLeaves()
{
var employeeleaves = db.EmployeeLeaves.Include(e => e.Employee);
return employeeleaves.AsEnumerable();
}
// GET api/EmployeeLeaveApi/5
public EmployeeLeave GetEmployeeLeave(int id)
{
EmployeeLeave employeeleave = db.EmployeeLeaves.Find(id);
if (employeeleave == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return employeeleave;
}
PUT api/EmployeeLeaveApi/5
public HttpResponseMessage PutEmployeeLeave(int id, EmployeeLeave employeeleave)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
if (id != employeeleave.LeaveID)
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
db.Entry(employeeleave).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
// POST api/EmployeeLeaveApi
public HttpResponseMessage PostEmployeeLeave(EmployeeLeave employeeleave)
{
if (ModelState.IsValid)
{
db.EmployeeLeaves.Add(employeeleave);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, employeeleave);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = employeeleave.LeaveID }));
return response;
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
// DELETE api/EmployeeLeaveApi/5
public HttpResponseMessage DeleteEmployeeLeave(int id)
{
EmployeeLeave employeeleave = db.EmployeeLeaves.Find(id);
if (employeeleave == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
db.EmployeeLeaves.Remove(employeeleave);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
return Request.CreateResponse(HttpStatusCode.OK, employeeleave);
}
// [Route("Api/goals/update/{id}")]
[HttpGet]
[Route("Api/EmployeeLeaveApi/ApproveLeave/{id}")]
public string ApproveLeave(int id, EmployeeLeave obj)
{
var leaveIdFound = db.EmployeeLeaves.FirstOrDefault(x => x.LeaveID == id);
if (leaveIdFound != null)
{
leaveIdFound.Status = obj.Status;
db.SaveChanges();
return "Customer updated successfully!";
}
return "Customer updated fails!";
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
Я также установил пакет AttributeRouting.
Но когда я тестирую использование «http://localhost:30429/Api/EmployeeLeaveApi/ApproveLeave «ссылка, я получил ошибку! Ошибка:
{«Сообщение»: «Произошла ошибка»., «ExceptionMessage»: «Было обнаружено несколько действий, которые соответствуют запросу: rnHRM_Project.EmployeeLeave GetEmployeeLeave(Int32) на t….
Я просто хочу отправить такой запрос
update leaveTable set status="1" where Leaveid=12"
поле others останется неизменным.
как это можно сделать? Кто-нибудь подскажет, как я могу создать и использовать пользовательский метод web api из angular? cshtml :
<a href="" ng-click="approveLeave(item.LeaveID)"
JS-файл:
$scope.approveLeave = function (a) {
$http.put('http://localhost:30429/api/employeeleaveApi/' a)
.success(function (data) {
console.log("inserted succes");
}).error(function () {
});
Комментарии:
1. Существует другое действие, которое фактически имеет тот же маршрут, что и это действие. Вот что означает ошибка. Не могли бы вы показать другие действия в контроллере API, чтобы мы могли точно определить, какое из них?
2. Я отредактировал сообщение с помощью моего полноценного контроллера web api. Я также отредактировал файл js и событие ng-click, поскольку мне не нужно отправлять все файлы в Api. Мне просто нужно отправить LeaveID и статус 2/1 (2 = отклонено / 1 = одобрено) контроллеру, чтобы обновить только поле статуса таблицы.
3. Я также добавил ранее в WebApiConfig.cs, поскольку мой api не работал.
code GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);