【问题标题】:jQuery Ajax returns undefined result from asp.net core controller's POST actionjQuery Ajax 从 asp.net 核心控制器的 POST 操作返回未定义的结果
【发布时间】:2018-05-10 18:40:22
【问题描述】:

无法通过我的 AJAX 和 MVC 6 控制器交朋友。

这就是我为 SetFormValues POST-action 定义 AJAX 调用的方式:

Index.cshtml

$.ajax({
    type: "Post",
    url: "Home/SetFormValues",
    data: { Name: name, Phone: phone },
    dataType: "json",
    success: function (result) {
        SuccessFunction(result)
    },
    error: function () {
        alert("ALARM!");
    },
    async: false
})

我看到控制器工作并执行 SetFormValues 操作,定义如下:

HomeController.cs

[HttpPost]
public JsonResult SetFormValues(string Name, string Phone)
{
    string NameErrorStr = string.IsNullOrWhiteSpace(Name) ? "Обязательное поле" : string.Empty;
    string PhoneErrorStr = string.IsNullOrWhiteSpace(Phone) ? "Обязательное поле" : string.Empty;

    var result = new { NameError = NameErrorStr, PhoneError = PhoneErrorStr };
    var jresult = Json(result);

    return jresult;
}

调试器显示操作执行并且我生成的 JSON 对象正确填充:

最后,他的SuccessFunction(result)是这样定义的:

再次索引.cshtml

function SuccessFunction(result) {
    alert("Success function shit executed. result=" +
        result + "NameError=" +
        result.NameError + ". PhoneError=" +
        result.PhoneError);

    $("#nameerror").append(result.NameError);
    $("#phoneerror").append(result.PhoneError);
}

功能有效,发出警报,但无论我做什么,结果都保持“未定义”:

result = [object Object]
result.val = undefined

也许我必须正确反序列化 JSON 结果或在上面的声明中填写一些属性,我不知道。 我正在使用最新的 jquery 库,验证和不引人注目。 我也尝试过 JSON.parse(result),正如最新的 jQuery 规范中提到的那样,但效果不佳。

请帮帮我:)

【问题讨论】:

  • 使用 JS 调试器查看你的对象是什么。
  • 或查看网络标签中的响应。

标签: ajax asp.net-mvc asp.net-core asp.net-core-2.0


【解决方案1】:

在 asp.net core 中,默认情况下,序列化器使用 camelCase 属性名称进行 json 序列化。所以你的结果会是这样的

{"nameError":"some message","phoneError":"some message here"}

Javascript 区分大小写。所以使用正确的大小写

$("#nameerror").append(result.nameError);
$("#phoneerror").append(result.phoneError);

供参考:MVC now serializes JSON with camel case names by default

【讨论】:

  • 非常感谢。我花了将近3个小时,但我没有发现这个小技巧。
【解决方案2】:

当我在启动文件中添加这一行时,它工作得很好

public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });


        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
        services.AddDbContext<DataContext>(option => option.UseSqlServer(Configuration.GetConnectionString("DbCrudOperation")));

    }


function Edit(id) {
    $.ajax({
        type: 'GET',
        url: "/AjacCrud/EditPahe/" + id,
        dataType: 'JSON',
        contentType: "application/json",
        success: function (response) {

            $("#nameEmp").val(response.ID);
            console.log(response.ID);

        },
        error: function (GetError) {

            alert(GetError.responseText);

        }
    });

};

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2019-01-04
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多