jquery 向Web API控制器发送请求时出错

ha5z0ras  于 2023-11-17  发布在  jQuery
关注(0)|答案(1)|浏览(129)
  • 问题 *

我正在创建一个ASP.NET MVC网站,正如标题所说,我试图用jquery向Web API控制器发送POST请求,但总是收到404错误。疯狂的是,在. NET Framework 4.5中,同样的事情可以工作,但在.NET Framework 4.6.2中,它真的不行。我在谷歌中找到了很多线程,解释了它可能出错的地方,但是这些都不管用。所以,下面是我的代码:
我的Web API控制器:

[Authorize]
public class CartController : ApiController
{
    private ApplicationDbContext _context;

    public CartController()
    {
        _context = new ApplicationDbContext();
    }

    [HttpPost]
    public IHttpActionResult AddToCart(string productId)
    {
        if (!ModelState.IsValid || !ItemIsValid(productId))
            return BadRequest();

        var newCartItem = new ShoppingCartItem
        {
            ProductId = productId,
            UserId = User.Identity.GetUserId()
        };

        _context.ShoppingCartItems.Add(newCartItem);
        _context.SaveChanges();

        return Ok();
    }

    private bool ItemIsValid(string productId)
    {
        return Enumerable.Any(_context.Products, contextproduct => contextproduct.Id.ToString() == productId && contextproduct.NumberAvailable > 0);
    }
}

字符串
我的jQuery代码:

$(".buy-button").click(function() {
            if (@User.Identity.IsAuthenticated.ToString().ToLower() === true) {
                $.ajax({
                    url: "/api/cart",
                    method: "POST",
                    data: $(this).next().val()
                }).done(function() {
                    alert("Product succesfully added to cart!");
                });
            } else {
                window.location.href = "@Url.Action("Login", "Account")";
            }
        });


我的Global.asax代码:

AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

我所尝试的

1)有些线程说Global.asax中的“调用”顺序很重要,所以我用各种可能的方法改变了RouteConfig.RegisterRoutes(RouteTable.Routes)的位置。
2)在我的Web Api action([Route(“API/Cart/AddToCart”)])中添加了路由属性,我从经验中知道这是多余的,并相应地更改了我的jQuery代码。
3)我没有添加属性,而是直接将Routes添加到Web API Config中。
4)我还尝试直接用Postman调用API(当然,我首先从Web API控制器中删除了Authorize属性)。
在这个问题上的任何帮助都是感激的。谢谢。

6kkfgxo0

6kkfgxo01#

我知道你谈到了改变路由配置,但我不知道细节,你有没有尝试Map到行动,以及像

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

字符串
然后在你的电话里

$.ajax({
                url: "api/Cart/AddToCart",
                type: "POST",
                contentType: "application/json",
                data: JSON.stringify($(this).next().val())
            }).done(function() {
                alert("Product succesfully added to cart!");
            });


此外,如果您想发送productid,还有另一种方法可以将该值分配给按钮的data-rowId属性,如
HTML代码

button type="button" value="Add to cart" data-RowId="@item.productID"


然后在jquery中得到这个值,

var productID = $(this).attr('data-RowId');


并将其作为

data: {productId : productID }


假设您有一个item对象,并且它具有ProductID

相关问题