将 Json 数据传递给 MVC 控制器 - 操作方法对象参数
Passing Json data to MVC controller - Action Method's JObject Parameter
抱歉格式或拼写错误。因为我正在匆忙地写这篇 post。 :)
我正在将 json 数据传递给简单控制器(MVC 控制器)的操作方法。以下是供参考的示例代码。
JS代码:
var json = {IsInit :true, SearchParam:{ 类型:"xx",名称:"xx",排序: ""} };
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 请求中传递多个参数。
如何获取传递给 MVC 控制器的操作方法的 JSON 数据,以便 SearchParam Json 数据自行转换为 JObject。即初始第一个 Action 方法签名应该在没有任何主要方法签名更改的情况下使用。
很少观察到:
如果我在 API Controller 中将上述操作方法转换为 api;它开始工作,但说过你需要遵循下面的方法签名。以下方法不适用于 MVC 控制器。不知道为什么??但是,出于某种原因;我不能使用 API 控制器。
<HttpPost>
<Route("Data")>
Function GetData(ByVal req As Newtonsoft.Json.Linq.JObject) As ActionResult
Return Nothing
End Function
谢谢!!
最好不要为此使用 JOBject。相反,创建和使用 模型 class 更加实用,强烈建议使用。然后,MVC Web API 会将传入的 JSON 绑定到模型对象,全部免费。
示例:
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
注意这里我把所有东西都堆成一个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()
。
谢谢彼得!!你的评论给了我方向。下面的代码片段用于将 JSON 数据包装到字典对象中。在这里,我理解你不使用 JObject 而是依赖 Model 对象的观点。但出于某种原因;由于来自其他端点的动态 JSON 性质,我必须使用字典对象来获取 JSON。
Public Class MyData
Public Property IsInit As Boolean
Public Property SearchParam As Dictionary(Of Object, Object)
End Class
非常感谢!!
抱歉格式或拼写错误。因为我正在匆忙地写这篇 post。 :)
我正在将 json 数据传递给简单控制器(MVC 控制器)的操作方法。以下是供参考的示例代码。
JS代码:
var json = {IsInit :true, SearchParam:{ 类型:"xx",名称:"xx",排序: ""} };
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 请求中传递多个参数。
如何获取传递给 MVC 控制器的操作方法的 JSON 数据,以便 SearchParam Json 数据自行转换为 JObject。即初始第一个 Action 方法签名应该在没有任何主要方法签名更改的情况下使用。
很少观察到:
如果我在 API Controller 中将上述操作方法转换为 api;它开始工作,但说过你需要遵循下面的方法签名。以下方法不适用于 MVC 控制器。不知道为什么??但是,出于某种原因;我不能使用 API 控制器。
<HttpPost> <Route("Data")> Function GetData(ByVal req As Newtonsoft.Json.Linq.JObject) As ActionResult Return Nothing End Function
谢谢!!
最好不要为此使用 JOBject。相反,创建和使用 模型 class 更加实用,强烈建议使用。然后,MVC Web API 会将传入的 JSON 绑定到模型对象,全部免费。
示例:
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
注意这里我把所有东西都堆成一个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()
。
谢谢彼得!!你的评论给了我方向。下面的代码片段用于将 JSON 数据包装到字典对象中。在这里,我理解你不使用 JObject 而是依赖 Model 对象的观点。但出于某种原因;由于来自其他端点的动态 JSON 性质,我必须使用字典对象来获取 JSON。
Public Class MyData
Public Property IsInit As Boolean
Public Property SearchParam As Dictionary(Of Object, Object)
End Class
非常感谢!!