Почему три из четырех очень похожих вызовов ajax работают как посты, а четвертый работает только как получение? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть MVC View с четырьмя разделами (не частичными), у каждого из которых есть своя кнопка сохранения. Эти кнопки сохранения не позволяют сохранить всю форму, просто поле или два данных, в части модели представления. Это Псевдоним, По умолчанию, Формат и Специальные. В представлении есть функция javascript / jQuery для вызова контроллера для каждой кнопки сохранения. Код ajax для Alias ​​работает только тогда, когда он и связанный с ним метод контроллера определены как GET. Остальные три прекрасно работают как POST.

Я пробовал код SaveAlias, настроенный как POST и Get. С точкой останова, установленной в методе контроллера, она никогда не достигается при установке в качестве POST. Если я попробую ту же настройку с остальными тремя, что и POST, точка останова будет достигнута правильно.

// JavaScript в представлении OnSaveAlias ​​() Работает как GET // Не работает, если настроен как POST.

function OnSaveAlias() {
    $('#AliasClearButton').removeClass("d-none");
    $('#AliasClearButton').addClass("d-block");
    var name = $('#ActiveEntity_Alias_Alias').val();
    $.ajax({
        type: 'GET',
        datatype: "json",
        url: '@Url.Action("SaveAliasG", "Entities")',
        data: { Name: name },
        contentType: 'application/json',
        success: function (message) {
            if (message) {
                $alert('Error');
            } else {
                window.location.href = "Create";
            }
        }
    });
};

// Соответствующий код контроллера для GET

[HttpGet]
public JsonResult SaveAliasG(String Name)
{
    WFViewModel = (WorkflowVM)TempData.Peek("WFViewModel");
    WFViewModel.ActiveEntity.Alias.Alias = Name;
    WFViewModel.ActiveEntity.AliasesSaved = true;
    SelectListItem newItem = new SelectListItem()
    {
        Text = Name,
        Value = "0"
    };
    WFViewModel.ActiveEntity.EntityAliasList.Add(newItem);
    TempData["WFViewModel"] = WFViewModel;
    return null;
}

// JavaScript и код контроллера для Default, который работает как POST

function OnSaveDefault() {
    $('#DefaultsClearButton').removeClass("d-none");
    $('#DefaultsClearButton').addClass("d-block");
    var name = $('#ActiveEntity_DefVals_DefaultValue').val();
    $.ajax({
        type: 'POST',
        datatype: "json",
        url: '@Url.Action("SaveDefaultP", "Entities")',
        data: { Name: name },
        contentType: 'application/json',
        success: function (message) {
            if (message) {
               $alert('Error');
            } else {
               window.location.href = "Create";
            }
        }
    });
};

// Соответствующий код контроллера для POST

[HttpPost]
public JsonResult SaveDefaultP(String Name)
{
    WFViewModel = (WorkflowVM)TempData.Peek("WFViewModel");
    WFViewModel.ActiveEntity.DefVals.DefaultValue = Name;
    WFViewModel.ActiveEntity.DefaultsSaved = true;
    TempData["WFViewModel"] = WFViewModel;
    return null;
}

НЕТ видимых сообщений об ошибках и ни одного не замечено, если точки останова установлены в коде javascript через отладчик F12.

1 Ответ

0 голосов
/ 27 июня 2019

У вас есть POST, который работает, и POST, который не работает в одном контроллере?

@Url.Action("SaveDefaultP", "Entities")' приводит к /Entities/SaveDefaultP, но это не имя метода, с которым он пытается сопоставить. Это маршрут. Если у вашего контроллера только один [HttpPost], он будет автоматически направлен на этот метод. Если у вас есть два [HttpPost] метода, то я думаю, что он просто находит первый.

Попробуйте переключить GET обратно в POST, но добавьте атрибут для каждого метода для Route.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...