【问题标题】:Passing Json data to MVC controller - Action Method's JObject Parameter将 Json 数据传递给 MVC 控制器 - Action 方法的 JObject 参数
【发布时间】:2017-10-12 15:48:48
【问题描述】:

抱歉,格式或拼写错误。因为我在匆忙写这篇文章。 :)

我将 json 数据传递给简单控制器(MVC 控制器)的操作方法。这是以下示例代码以供参考。

JS 代码:

var json = {IsInit :true, SearchParam:{ Type:"xx",Name:"xx",sort: ""} };

    Nx$(document).ready(function () {

        Nx$.ajax({
            async: true,
            contentType: "application/json; charset=utf-8",
            type: "POST",
            url: "Home/Data",
            dataType: "json",
            data: JSON.stringify(json),
            success: function (msg) {
                alert('success');
            },
            error: function (jqxhr, textStatus, error) {
                alert('fail');
            }
        });

动作方法:

<HttpPost>
        <Route("Data")>
        Function GetData(ByVal IsInit As Boolean, ByVal SearchParam As Newtonsoft.Json.Linq.JObject) As ActionResult
            Return Nothing
        End Function

现在,上面的操作根本不会调用。但是如果您使用下面的代码,那么它会进行调用,但 SearchParam 的类型仅为 [object],您不能使用 searchParam 对象的任何值。

<HttpPost>
    <Route("Data")>
    Public Function GetData(ByVal IsInit As Boolean, ByVal SearchParam As Object) As Object
        Return Nothing
    End Function

我认为它无法在具有复杂 json 对象的 POST 请求中传递多个参数。

如何将 JSON 数据传递给 MVC 控制器的操作方法,以便 SearchParam Json 数据自行转换为 JObject。即最初的第一个 Action 方法签名应该在没有任何重大方法签名更改的情况下使用。

很少观察:

  1. 如果我在 API 控制器中将上述操作方法作为 api;它开始工作,但已经说过您需要遵循以下方法签名。以下方法不适用于 MVC 控制器。不知道为什么??但是,出于某种原因;我不能使用 API 控制器。

        <HttpPost>
        <Route("Data")>
        Function GetData(ByVal req As Newtonsoft.Json.Linq.JObject) As ActionResult
            Return Nothing
        End Function
    

谢谢!!

【问题讨论】:

  • data: JSON.stringify(json),正在将数据转换为字符串。我建议你删除 dataType: "json", in ajax params

标签: jquery ajax asp.net-mvc json.net asp.net-apicontroller


【解决方案1】:

最好不要为此使用 JOBject。相反,创建和使用 Model 类 更为实用且强烈推荐。然后,MVC Web API 会将传入的 JSON 绑定到 Model 对象,这一切都是免费的。

例子:

Public Class MyData
    Public Property IsInit As Boolean
    Public Property Type As String
    Public Property Name As String
    Public Property Sort As String
End Class

请注意,在这里我将所有内容都堆放在一个类中。如果您想将IsInit 与其余部分分开,则可以这样拆分:

Public Class Param
    Public Property Type As String
    Public Property Name As String
    Public Property Sort As String
End Class

Public Class MyData
    Public Property IsInit As Boolean
    Public Property SearchParam as Param
End Class

然后像这样更改您的操作方法:

Function GetData(<FromBody()> ByVal data As MyData) As ActionResult
    ...
End Function

最后你可能需要在调用中使用data: json,所以不要调用JSON.stringify()

【讨论】:

  • 谢谢彼得。这和我要找的很接近。
【解决方案2】:

谢谢彼得!!你的评论给了我方向。下面的代码 sn-p 用于将 JSON 数据包装到 Dictionary 对象中。在这里,我理解您不使用 JObject 而是依赖模型对象的观点。但出于某种原因;由于来自其他端点的动态 JSON 特性,我必须使用字典对象来获取 JSON。

Public Class MyData
            Public Property IsInit As Boolean
            Public Property SearchParam As Dictionary(Of Object, Object)
        End Class

非常感谢!!

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 2015-01-25
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多