如何 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,我们会提供自己的实现。