ASP.NET MVC找到多个与请求匹配的动作

问题描述 投票:0回答:1

我正在尝试同时支持Web API和普通控制器。

我为不同的动作定义了不同的方法,但由于我一遍又一遍地追随错误,所以看起来有些错误。>

{"Message":"An error has occurred.","ExceptionMessage":"Multiple actions were found that match the request: 
\r\nPostFilter on type imaserver.Controllers.OrdersController\r\nPostOrder on type imaserver.Controllers.OrdersController",
"ExceptionType":"System.InvalidOperationException",
"StackTrace":"   
at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n   
at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n   
at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"}

这是我的代码:

RouteConfig

 public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            "CDN",
            "cdn/{directory}/{file}",
            new { controller = "CDN", action = "Download", directory = UrlParameter.Optional, file = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "API",
            url: "api/{controller}/{action}",
            defaults: new { controller = "Home", action = "Index" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}",
            defaults: new { controller = "Home", action = "Index" }
        );
    }
}

OrderController

public class OrdersController : ApiController
{
    private FoodDeliveryEntities db = new FoodDeliveryEntities();

    // GET: api/Orders
    public IQueryable<Order> GetOrders()
    {
        db.Configuration.ProxyCreationEnabled = false;
        return db.Orders;
    }

    // GET: api/Orders/5
    [ResponseType(typeof(Order))]
    public IHttpActionResult GetOrder(long id)
    {
        db.Configuration.ProxyCreationEnabled = false;
        Order order = db.Orders.Find(id);
        if (order == null)
        {
            return NotFound();
        }

        return Ok(order);
    }

    // PUT: api/Orders/5
    [ResponseType(typeof(void))]
    public IHttpActionResult PutOrder(long id, Order order)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != order.Id)
        {
            return BadRequest();
        }

        db.Entry(order).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!OrderExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/Orders/filter
    [HttpPost]
    public IHttpActionResult PostFilter(OrderFilter orderFilter)
    {
        db.Configuration.ProxyCreationEnabled = false;
        if (orderFilter.OrderType != null)
            return Ok(db.Orders.Include(o => o.OrderItems.Select(i => i.Item)).Include(c => c.Customer).OrderByDescending(o => o.PickupDate).Where(o => o.OrderType.Equals(orderFilter.OrderType)));
        else if (orderFilter.Status != null)
            return Ok(db.Orders.Include(o => o.OrderItems.Select(i => i.Item)).Include(c => c.Customer).OrderByDescending(o => o.PickupDate).Where(o => o.Status.Equals(orderFilter.Status)));
        else
            return Ok(db.Orders.Include(o => o.OrderItems.Select(i => i.Item)).Include(c => c.Customer));
    }

    // POST: api/Orders
    [ResponseType(typeof(Order))]
    public IHttpActionResult PostOrder(Order order)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.Configuration.ProxyCreationEnabled = false;
        order.Status = "New";
        order.CreatedAt = DateTime.Now;
        order.UpdatedAt = DateTime.Now;

        db.Orders.Add(order);
        db.SaveChanges();

        foreach (var orderItem in order.OrderItems)
        {
            orderItem.OrderId = order.Id;
            orderItem.CreatedAt = DateTime.Now;
            orderItem.UpdatedAt = DateTime.Now;
            orderItem.IsActive = true;
        }

        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = order.Id }, order);
    }

    // DELETE: api/Orders/5
    [ResponseType(typeof(Order))]
    public IHttpActionResult DeleteOrder(long id)
    {
        Order order = db.Orders.Find(id);
        if (order == null)
        {
            return NotFound();
        }

        db.Orders.Remove(order);
        db.SaveChanges();

        return Ok(order);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool OrderExists(long id)
    {
        return db.Orders.Count(e => e.Id == id) > 0;
    }

    public partial class OrderFilter
    {
        public string Status { get; set; }
        public string OrderType { get; set; }
    }
}

我也试图将PostFilter重命名为Filter,但没有用

我正在触发此URL:

http://somewebsite/api/Orders/filter  
POST

我在做什么错?

我正在尝试同时支持Web API和普通控制器。我为不同的动作定义了不同的方法,但是看起来有些错误,因为我一次又一次地跟踪错误{“ ...

asp.net-mvc
1个回答
0
投票

由于您是从ApiController继承的,因此只能有1个POST,GET,PUT或DELETE操作,要进行更多操作,请通过用方法修饰方法来更新每个操作以分配其唯一的路由

© www.soinside.com 2019 - 2024. All rights reserved.