从angular向c#api控制器发送数据绑定到错误操作

从angular向c#api控制器发送数据绑定到错误操作,c#,angularjs,asp.net-mvc-5.2,C#,Angularjs,Asp.net Mvc 5.2,问题: 为什么我的操作“添加”被命中而不是“删除”操作 错误消息: “ExceptionMessage”:“发现多个操作与 请求:加载项类型blog.Controllers.api.UsersController删除 键入blog.Controllers.api.UsersController 我的角度删除 $scope.delete = function (email) { $http.post('/api/users/Delete', email).success(func

问题: 为什么我的操作“添加”被命中而不是“删除”操作

错误消息:

“ExceptionMessage”:“发现多个操作与 请求:加载项类型blog.Controllers.api.UsersController删除 键入blog.Controllers.api.UsersController

我的角度删除

$scope.delete = function (email) {

        $http.post('/api/users/Delete', email).success(function() {
            initData();
        });           
    }
替代测试

 //$http({
        //        url: '/api/users/Delete',
        //        method: 'POST',
        //        data: { 'userEmail': email }
        //    })
        //    .success(function(data, status, headers, config) {
        //        initData();
        //    }).
        //    error(function(data, status, headers, config) {
        //        $scope.showError = true;
        //    });
我的MVC5API控制器

    private readonly UserDataAccess _userDataAccess;

    // GET: Users/Add
    [HttpPost]
    public HttpResponseMessage Add(User user)
    {
        _userDataAccess.AddUser(user);

        return Request.CreateResponse(HttpStatusCode.OK);
    }


// GET: Users/Delete - never gets hit
        [HttpPost]
        public HttpResponseMessage Delete([FromBody]string userEmail)
        {
            _userDataAccess.DelereUserByEmail(userEmail);

            return Request.CreateResponse(HttpStatusCode.OK);
        }

请注意,我不想使用路由解决此问题。

在WebApi中,每个路由只能有一个POST操作。为了使控制器类有多个POST操作,您需要定义新路由

如果您使用的是WebApi 2,则可以从
RoutingAttribute
中获益,并定义这些新的子路由

在控制器类中使用
RoutePrefixAttributte

[RoutePrefix('api/users')]
public class Users: ApiController{ ...
然后是您的2个子路线:

[Route('add')]
[HttpPost]
public HttpResponseMessage Add(User user){..

[Route('delete')]
[HttpPost]
public HttpResponseMessage Delete([FromBody]string userEmail) {
关于路线的信息

Web Api v1在应用程序启动事件的global.asax中全局定义资源。假设您使用的是Visual Studio 2013,并且基于Microsoft的默认模板,您的方法可能如下所示:

WebApi路由配置发生在此处
WebApiConfig.Register
,而MVC配置发生在此处
RouteConfig.registerOutes

您的WebApi路由配置应该如下所示

public static class WebApiConfig{
        public static void Register(HttpConfiguration config){            
            config.Routes.MapHttpRoute(
                name: "apiSample",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = System.Web.Http.RouteParameter.Optional  }
            );

     ...
如前所述,WebApi v2引入了路由属性,这些属性可与控制器类一起使用,并可促进路由配置

例如:

 public class BookController : ApiController{
     //where author is a letter(a-Z) with a minimum of 5 character and 10 max.      
    [Route("html/{id}/{newAuthor:alpha:length(5,10)}")]
    public Book Get(int id, string newAuthor){
        return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
    }

   [Route("json/{id}/{newAuthor:alpha:length(5,10)}/{title}")]
   public Book Get(int id, string newAuthor, string title){
       return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
   }
...
你也可以用类似的问题参考另一篇文章


您也可以手动配置路由

您可以在Api控制器中的delete方法上添加
[HttpDelete]
属性,然后使用调用它

[HttpDelete]
public IHttpActionResult Delete(string email) {
    return StatusCode(HttpStatusCode.NoContent);
}
引用…的文件

表示用于限制操作方法的属性,以便该方法仅处理HTTP DELETE请求


您是否尝试过使用
ActionName
并在默认路由之前向操作添加路由?thnx对于回答,这将非常有效,但我不希望在每个操作上都有特定的路由,因为这很难维护。
[HttpPost]
[Route('api/User/Delete/{userEmail}')]
public HttpResponseMessage Delete([FromBody]string userEmail)
{
}
[HttpDelete]
public IHttpActionResult Delete(string email) {
    return StatusCode(HttpStatusCode.NoContent);
}