1

我的 ajax 在 .net mvc 4 中调用了错误的方法,我不知道为什么。

我的阿贾克斯:

function addItem(id, ammount) {
$.ajax({
    url: "/Shoppingcart/AddItem?id="+id+"&ammount="+ammount,
    type: "post",
    cache: false,
    success: function (result) {
        alert("SUCCESS!!!");
    },
    error: function (textStatus, errorThrown) {
        window.console.log(textStatus, errorThrown);
    }
});
}

我的 mvc 控制器:

public class ShoppingcartController : Controller
{
    //
    // GET: /Shoppingcart/

    public ActionResult Index()
    {
        // Method 1
    }

    [HttpPost]
    public ActionResult AddItem(int id = -1, int ammount = 0)
    {
        return Redirect("~/Home");
    }
}

我的第一个方法被 ajax 调用,这很奇怪,因为我调用 /Shoppingcart/AddItem 为什么会发生这种情况,我应该怎么做才能让它工作?

解决方案: 问题不在方法调用上,而在路由堆栈上。显然,定义路线的顺序会影响它们的重要性。最具体的路线应该始终是要声明的第一条路线。

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

        routes.MapRoute(
            name: "Index",
            url: "{controller}/{id}",
            defaults: new { controller = "Home", action = "Index" },
            constraints: new { id = @"\d+" }
        );

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

        routes.MapRoute(
            name: "ControllerOnly",
            url: "{controller}",
            defaults: new { controller = "Home", action = "Index", id = 0 }
        );
    }
4

1 回答 1

3

问题在于您的路由,因为配置的路由按顺序匹配。

所以首先你应该把更具体的放在最后,然后放在更通用的。

您必须使用最通用的路线url: "{controller}"first 匹配 urllocalhost:1862/Shoppingcart/AddItem?id=18&ammount=1并使用 theaction = "Index"而不是 action AddItem

要修复它,请将您的路线顺序更改为:

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

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

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

要正确制作类似路由的 url ,您需要使用约束 on而不是/Product/18更改您的路由,并且您需要将其放在路由之前:"Index"idUrlParameter.Optional"Default"

routes.MapRoute(
    name: "Index",
    url: "{controller}/{id}",
    defaults: new { controller = "Home", action = "Index" },
    constraints: new {id = @"\d+"}
);
于 2012-10-22T14:26:55.003 回答