如何 post 部分视图模型到 Web API 控制器
How to post part of the viewmodel to a Web API controller
我有一个 VB 网络 API 应用程序。
我有一个 VB class/model 像这样。
Imports System.ComponentModel.DataAnnotations
Imports System.Web.Http
Public Class MSLDestinationInput
<HttpBindRequired>
<Required>
Public Property ShpmntCntrlNbr() As String
Get
Return m_ShpmntCntrlNbr
End Get
Set(value As String)
m_ShpmntCntrlNbr = value
End Set
End Property
Private m_ShpmntCntrlNbr As String
End Class
这是控制器:
Public Async Function GeneratePDF(data As MSLDestinationInput) As Task(Of IHttpActionResult)
If Not ModelState.IsValid Then
Return BadRequest(ModelState)
End If
Dim oMSLOutput As New MSLOutput
oMSLOutput.url = "api/PrintGenerateMSL"
Return Ok(oMSLOutput)
End Function
我使用 jQuery.ajax
和以下参数发布到控制器:
url: 'api/PrintGenerateMSL',
data: ko.toJSON(self),
type: "POST",
一切正常。但是我真的不需要发送整个淘汰赛模型。我只需要发送一些属性。我已尝试发送此数据:
data: {ShpmntCntrlNbr : self.ShpmntCntrlNbr() };
而不是 ko.toJSON(self)。当请求到达我的控制器时,我发现参数 data
是空的。
我怎样才能只将需要的数据发送到我的控制器而不是整个 ko 视图模型?
是的,stringify 处理了它。它现在正在使用。
data: JSON.stringify({ShpmntCntrlNbr : self.ShpmntCntrlNbr() }),
您需要对数据进行字符串化。一种方法是使用 JSON.stringify
,正如您所做的那样。
大多数(但不是所有)浏览器都包含 JSON 操作函数。问题是,如果有人试图在没有此方法的浏览器中使用您的应用程序,它将崩溃。或者你必须提供一个 polyfill。
好消息是,如果您使用 ko.toJSON
,则无需担心。事实上 ko.toJSON
做了两件事:
- 展开所有可观察对象,如果它们存在的话
- 转换为 JSON,使用
JSON.stringify
这意味着这两个选项都可以正常工作:
data: ko.ToJSON({ShpmntCntrlNbr : self.ShpmntCntrlNbr() })
data: ko.ToJSON({ShpmntCntrlNbr : self.ShpmntCntrlNbr })
请注意,第二个上的 属性 会自动展开。如果你拿了你的视图模型的一部分,它是一个对象树,在任何级别都包含一些可观察的属性,ko 也会自动打开它们。
而且,最重要的是,如果浏览器没有实现 JSON.stringify
,我们会提供自己的实现。
我有一个 VB 网络 API 应用程序。
我有一个 VB class/model 像这样。
Imports System.ComponentModel.DataAnnotations
Imports System.Web.Http
Public Class MSLDestinationInput
<HttpBindRequired>
<Required>
Public Property ShpmntCntrlNbr() As String
Get
Return m_ShpmntCntrlNbr
End Get
Set(value As String)
m_ShpmntCntrlNbr = value
End Set
End Property
Private m_ShpmntCntrlNbr As String
End Class
这是控制器:
Public Async Function GeneratePDF(data As MSLDestinationInput) As Task(Of IHttpActionResult)
If Not ModelState.IsValid Then
Return BadRequest(ModelState)
End If
Dim oMSLOutput As New MSLOutput
oMSLOutput.url = "api/PrintGenerateMSL"
Return Ok(oMSLOutput)
End Function
我使用 jQuery.ajax
和以下参数发布到控制器:
url: 'api/PrintGenerateMSL',
data: ko.toJSON(self),
type: "POST",
一切正常。但是我真的不需要发送整个淘汰赛模型。我只需要发送一些属性。我已尝试发送此数据:
data: {ShpmntCntrlNbr : self.ShpmntCntrlNbr() };
而不是 ko.toJSON(self)。当请求到达我的控制器时,我发现参数 data
是空的。
我怎样才能只将需要的数据发送到我的控制器而不是整个 ko 视图模型?
是的,stringify 处理了它。它现在正在使用。
data: JSON.stringify({ShpmntCntrlNbr : self.ShpmntCntrlNbr() }),
您需要对数据进行字符串化。一种方法是使用 JSON.stringify
,正如您所做的那样。
大多数(但不是所有)浏览器都包含 JSON 操作函数。问题是,如果有人试图在没有此方法的浏览器中使用您的应用程序,它将崩溃。或者你必须提供一个 polyfill。
好消息是,如果您使用 ko.toJSON
,则无需担心。事实上 ko.toJSON
做了两件事:
- 展开所有可观察对象,如果它们存在的话
- 转换为 JSON,使用
JSON.stringify
这意味着这两个选项都可以正常工作:
data: ko.ToJSON({ShpmntCntrlNbr : self.ShpmntCntrlNbr() })
data: ko.ToJSON({ShpmntCntrlNbr : self.ShpmntCntrlNbr })
请注意,第二个上的 属性 会自动展开。如果你拿了你的视图模型的一部分,它是一个对象树,在任何级别都包含一些可观察的属性,ko 也会自动打开它们。
而且,最重要的是,如果浏览器没有实现 JSON.stringify
,我们会提供自己的实现。