首页 > 解决方案 > 为什么四分之三的非常相似的 ajax 调用作为帖子工作,而第四个只作为 get 工作?

问题描述

我有一个 MVC 视图,其中有四个部分(不是部分视图),每个部分都有自己的保存按钮。这些保存按钮不会将整个表单仅将一两个数据字段保存到视图模型的一部分中。它们是别名、默认值、格式和特殊值。在视图中有一个 javascript/jQuery 函数可以为每个保存按钮调用控制器。Alias 的 ajax 代码仅在其及其关联的控制器方法被定义为 GET 时才有效。其他三个作为 POST 工作得非常好。

我已尝试将 SaveAlias 代码配置为 POST 和 Get。在控制器方法中设置断点后,在设置为 POST 时永远不会到达该断点。如果我尝试与其他三个相同的设置作为 POST 的断点正确到达。

// View OnSaveAlias() 中的 javascript 用作 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 和控制器代码,用作 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;
}

通过 F12 调试器在 javascript 代码中设置断点时,没有可见的错误消息,也没有看到任何错误消息。

标签: c#jqueryajaxasp.net-mvcbootstrap-4

解决方案


您是否有正在工作的 POST 和不在同一个控制器中工作的 POST?

@Url.Action("SaveDefaultP", "Entities")'结果,/Entities/SaveDefaultP但它不是它试图匹配的方法名称。是路线。如果您的控制器只有一个[HttpPost],它将自动路由到该方法。如果您有两种[HttpPost]方法,那么我认为它只会找到第一种。

尝试将 GET 切换回 POST,但为Route.


推荐阅读