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

ルートのようなURLを/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 に答える