将Json数据传递给MVC控制器 - Action Method' JObject参数

时间:2017-10-12 15:48:48

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

抱歉格式错误或拼写错误。因为我正急着写这篇文章。 :)

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

JS CODE:

var json = {IsInit:true,SearchParam:{Type:&#34; xx&#34;,Name:&#34; xx&#34;,sort:&#34;&#34;}}; < / p>

    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
    
  2. 谢谢!

2 个答案:

答案 0 :(得分:3)

最好永远不要使用JOBject。相反,它更实用,强烈建议创建和使用模型类。然后,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()

答案 1 :(得分:0)

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

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

非常感谢!!