【问题标题】:Passing an object and primitives to a Controller via JQuery通过 JQuery 将对象和原语传递给控制器
【发布时间】:2019-11-28 22:01:18
【问题描述】:

从查看一个类似的线程开始,但那里的解决方案对我不起作用。

Passing multiple objects to my controller

这是我的 javascript onclick 事件:

var test = function () {
        var vm = {
            "IsNew": true,
            "SelectedId": 1,
            "SelectedCode": null
        };
        var idk= JSON.stringify(vm);
        $.ajax({
            url: $("base").attr("href") + "Controller/ComplexityTest",
            method: "POST",
            contentType: 'application/json',
            data: idk,
            success: function (msg) {
                alert('success')
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert("Error: " + textStatus + ", " + errorThrown);
            }
        });
    };

在我的控制器上,我有这个端点:

    [HttpPost]
    public async Task<IActionResult> ComplexityTest([FromBody] MyViewModel vm, long categoryId, long personId, DateTime startDate)
    {
        //...do work
    }

为简单起见,假设这是我的模型:

public class MyViewModel
{
    public bool IsNew {get; set;}
    public int SelectedId {get; set;}
    public string SelectedCode {get; set;}
}

在运行它时,我可以看到 vm 已正确填充。问题是我还试图填充一些额外的原语与 MyViewModel 一起发送。

我尝试在我的 vm 初始化程序中添加其他字段,并将整个内容字符串化。

我尝试将数据设置为 { "vm": idk, "categoryId": 1, etc...}。

到目前为止,我所做的一切都导致我不仅获得了新参数,而且还丢失了我原来的 vm 对象。

如何将一个对象(类)和多个原语传递给 POST 方法?我是否只需要创建一个包含附加参数的新 DTO 对象,然后发送它?

【问题讨论】:

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


    【解决方案1】:

    在 url ajax 参数中,使用这个

    url: '@Html.Raw(Url.Action("ComplexityTest", "Home", new { categoryId = 123, personId = 456, startDate = "2019-07-19" }))',
    

    老实说,我不知道为什么 Url.Action 在 .net 内核中不能正常工作,但我使用 Html.Raw 使其工作。 ??‍♂️??‍♂️??‍♂️

    ...但它有效....

    【讨论】:

    • 最终,我确实创建了一个新模型,它封装了我需要的所有参数,只是因为我不希望它们出现在查询字符串中。但是你的建议让我走上了正确的道路。谢谢。
    【解决方案2】:

    这是一种在 javascript 中实现的方法

    var test = function () {
        var vm = {
            "IsNew": true,
            "SelectedId": 1,
            "SelectedCode": null
        };
        var obj = { vm: vm, categoryId: 1, personId:3, startDate:new Date() };
    
        var idk= JSON.stringify(obj);
        $.ajax({
            url: $("base").attr("href") + "Controller/ComplexityTest",
            method: "POST",
            contentType: 'application/json',
            data: idk,
            success: function (msg) {
                alert('success')
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert("Error: " + textStatus + ", " + errorThrown);
            }
        });
    };
    

    我真的不知道 $("base").attr("href") 为你带来了什么,但我尝试了 /Controller/ComplexityTest

    我也没有使用[FromBody] MyViewModel vm,而是使用MyViewModel vm

    【讨论】:

    • 我不知道它是否与 .Net Core 相关,或者是否涉及另一个 gremlin,但我无法使用这种方法将任何数据发布回控制器。我能做的最好的事情是只对 vm 对象进行字符串化,然后将端点更改为接受字符串并手动将其转换为我期望的类。
    猜你喜欢
    • 2016-04-08
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多