2012-10-22 38 views
1

我的ajax在.net mvc 4中調用了錯誤的方法,我找不到原因。Ajax調用錯誤的方法

我的ajax:

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"); 
    } 
} 

我的第一個方法是越來越被阿賈克斯,因爲我所說的這是奇怪/購物車/的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 } 
     ); 
    } 
+0

你的代碼看起來不錯,你肯定的了'addItem'函數被調用?請檢查fiddler/dev-console/firebug您發送到服務器的哪些請求。 – nemesv

+0

根據提琴手網址http:// localhost:1862/Shoppingcart/AddItem?id = 18&ammount = 1 正在被調用。附加到上述我的成功消息是正確觸發 –

+0

如果是的話,你有任何自定義路由請發佈您的路由配置? – nemesv

回答

3

問題在於您的路由,因爲配置的路由按順序匹配。

所以首先你應該把更多的指定和更通用的。

你有最普通的途徑與url: "{controller}"第一相匹配的URL localhost:1862/Shoppingcart/AddItem?id=18&ammount=1並使用action = "Index"而不是行動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 } 
); 

做出那樣/Product/18路線網址正確,您需要使用上id而不是UrlParameter.Optional約束更改"Index"路線,你需要把它在"Default"路線前:

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

這聽起來合乎邏輯,但是當我應用上述「解決方案」時,我的http:// localhost:1862/Product/18不再起作用 –

+0

@ user1069574查看我的更新答案。 – nemesv

+0

太棒了!它現在(有點)的作品!至少該功能正在調用,但是(請參閱更新的問題)我的重定向只是被忽略。怎麼來的? (該行根據我的調試器被觸發,但不採取任何操作) –