Создайте пользовательский метод в web api и вызовите его из angularjs

#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);