Действия POST с тем же именем и различными парами [по умолчанию] не будут срабатывать от вызова Ajax

В основном, у меня есть эти 2 действия:

[HttpPost]
[ActionName("ListarTodosGrupo")]
public ActionResult ListAllFromGroup(string wildcard = "", int registries = 10)
{
    // ...
}

[HttpPost]
[ActionName("ListarTodosGrupo")]
public ActionResult ListAllFromGroup(string cnpj, string wildcard = "", int registries = 10)
{
    // ...
}

Эти действия должны быть вызваны из вызова Ajax. Я пытаюсь вызвать различные действия в зависимости от аргументов вызова Ajax (data). Например:

$.ajax({
    url: "/Cliente/ListarTodosGrupo",
    type: "post",
    dataType: "json",
    cache: true,
    data: { // This should fire the first action
        wildcard: $("input#nomeCliente").val(),
        registries: 10
    },
    ...
});

$.ajax({
    url: "/Cliente/ListarTodosGrupo",
    type: "post",
    dataType: "json",
    cache: true,
    data: { // This should fire the second action
        wildcard: $("input#nomeCliente").val(),
        registries: 10,
        cnpj: '02696818000116' 
    },
    ...
});

Однако это не работает (запускается только первое действие, несмотря на количество заданных парамов). Это вообще возможно? Как я могу это сделать?

2 ответа

  1. .NET MVC не принимает во внимание перегруженные методы при вызове действий, только имя метода и любые атрибуты http-глагола (например, HttpPost, HttpGet и т.д.). Поэтому всегда будет вызываться только первый метод, какие бы данные вы ему ни отправляли.

    Вам нужно переосмыслить свое решение. Самым простым изменением было бы иметь один открытый метод, ListarTodosGrupos, который принимает все потиенно необходимые данные и по умолчанию другие к null, где применимо ofc). Создание частных методов для различных функций. На основе данных, отправленных в ListarTodoGropus, можно сделать так, чтобы код вызывал требуемый частный метод.

  2. [HttpPost]
    [ActionName("ListarTodosGrupo")]
    public ActionResult ListAllFromGroup(string wildcard = "", int registries = 10)
    {
        // ...
    }
    
    [HttpPost]
    [ActionName("ListarTodosGrupo2")]
    public ActionResult ListAllFromGroup(string cnpj, string wildcard = "", int registries = 10)
    {
        // ...
    }
    

    Не пробовал, но если вы можете изменить имя действия вашего второго метода на ListarTodosGrupo2, то вы можете вызвать метод post с помощью ajax, как показано ниже.

    $.ajax({
        url: "/Cliente/ListarTodosGrupo",
        type: "post",
        dataType: "json",
        cache: true,
        data: { // This should fire the first action
            wildcard: $("input#nomeCliente").val(),
            registries: 10
        },
        ...
    });
    
    $.ajax({
        url: "/Cliente/ListarTodosGrupo2",
        type: "post",
        dataType: "json",
        cache: true,
        data: { // This should fire the second action
            wildcard: $("input#nomeCliente").val(),
            registries: 10,
            cnpj: '02696818000116' 
        },
        ...
    });