2016-01-20 103 views
0

我有一个VB Web API应用程序。如何将视图模型的一部分发布到Web API控制器

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

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视图模型?

回答

1

您需要将数据串联起来。一种方法是使用JSON.stringify,就像你所做的那样。

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

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

  • 解开所有的观测值(如果存在)
  • 转换成JSON,通过使用JSON.stringify

这意味着,双方的这个选项会很好地工作:

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

注意,在第二个属性将被自动解开。如果你把一块viewmodel作为一个包含一些可观察属性的对象树,ko也会自动解包它们。

而且,最重要的是,如果浏览器不实现JSON.stringify,KO防阻它自己的实现。

1

yes stringify照顾了它。它现在正在工作。

data: JSON.stringify({ShpmntCntrlNbr : self.ShpmntCntrlNbr() }), 
相关问题