如何将部分viewmodel发布到Web API控制器

时间:2016-01-20 12:32:31

标签: ajax post knockout.js asp.net-web-api2

我有一个VB Web API应用程序。

我有一个像这样的VB类/模型。

Type                Description
----                -----------

int                 integer of arbitrary size
float               floating point number
bool                boolean value
str                 unicode string
bytes               8-bit string
object              an arbitrary object (object is the common base class)
List[str]           list of str objects
Dict[str, int]      dictionary from str keys to int values
Iterable[int]       iterable object containing ints
Sequence[bool]      sequence of booleans
Any                 dynamically typed value with an arbitrary type

这是控制器:

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",

而不是ko.toJSON(自我)。当请求到达我的控制器时,我发现参数data: {ShpmntCntrlNbr : self.ShpmntCntrlNbr() }; 为空。 如何只将所需数据发送到我的控制器而不是整个ko视图模型?

2 个答案:

答案 0 :(得分:1)

是的,stringify会照顾它。它现在正在使用。

data:  JSON.stringify({ShpmntCntrlNbr : self.ShpmntCntrlNbr() }),

答案 1 :(得分:1)

您需要对数据进行字符串化。一种方法是使用JSON.stringify,就像你已经完成的那样。

大多数(但不是所有浏览器)都包含JSON操作函数。问题是如果有人试图在没有这种方法的浏览器中使用你的应用程序,它就会崩溃。或者你必须完成一个填充物。

好消息是,如果您使用ko.toJSON,则不必担心。实际上ko.toJSON做了两件事:

  • 展开所有可观测量(如果存在)
  • 使用JSON.stringify
  • 转换为JSON

这意味着这两个选项都可以正常工作:

data: ko.ToJSON({ShpmntCntrlNbr : self.ShpmntCntrlNbr() })
data: ko.ToJSON({ShpmntCntrlNbr : self.ShpmntCntrlNbr })

请注意,第二个属性将自动解包。如果你拍摄了一个视图模型,它是一个包含任何级别的一些可观察属性的对象树,ko也会自动解包它们。

而且,最重要的是,如果浏览器没有实现JSON.stringify,则ko会提供自己的实现。