2013-09-30 71 views
1

我正在使用knockout,我正在使用的模型中有很多项目。我将它发布到一个控制器,像这样:在Asp .Net Web Api中使用对象

ajaxRequest("post", "/api/care/saveevent?student=" + self.StudentId(),self.CurrentEvent()) 
       .done(function (allData) { 
        alert("ran ok"); 
       }) 
       .fail(function() { 
        alert("An error occurred"); 
       }); 

我的控制器有这样的:

public string SaveEvent(object data, int student) 
{ 
    return "test"; 
} 

我想使用的对象,这样我就不必在淘汰赛模型上复制所有控制器或其他任何地方,所以我可以修改一次。

它帖子正常,当调试对象中的所有数据是正确的。但是,我不正常使用对象,不知道如何获取它的内容,只需将data.PropertyName导致intellisense错误。

什么是正确的方式来获取其内容,是我想要做的不可能?

+0

看起来你拼错'动态'作为'对象'。 –

+0

难道你不能施展它? – Krishna

+0

您无法直接从对象中获取所需属性。您需要将对象转换为具有所需属性的类型。 – Excommunicated

回答

4

如果您想避免强类型(C#)模型类,则可以使用dynamic类型。

但是,我会建议您使用模型绑定的属性创建一个类。您必须在两个地方进行更改,这是事实,但您可以获得智能感知等的所有优点(此外,无论如何,在大多数情况下,仅在客户端JavaScript代码中添加更多属性而无需修改服务器端即可) )

+0

啊,这正是我想到的,正是我想避免谢谢。 – user1166905

0

如果您只想要进行部分更新,则使用OData是我的首选方式。

这是关于它的一些discussion

代码从例如复制:

[AcceptVerbs("PATCH")] 
public void Patch(int id, Delta<Person> person) 
{ 
    var personFromDb = _personRepository.Get(id); 
    person.Patch(personFromDb); 
    _personRepository.Save(); 
} 

您使用PATCH HTTP动词送部分模型。通过这种方式,您可以减少网络开销,同时又可以充分利用类型化的类。

当您进行ajax调用时,请记住使用patch动词。

$.ajax({ 
    url: 'api/person/1', 
    type: 'PATCH', 
    data: JSON.stringify(obj), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function(callback) {    
     //handle errors, do stuff yada yada yada 
    } 
}); 

好处是你可以通过一个obj只传递改变了值的属性。但它仍然会与你输入的类绑定。

0

我建议使用ViewModel来处理数据对象。

给定一个视图模型,如:

public class SaveEventViewModel 
{ 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
} 

你的控制器然后将类似于:

public string SaveEvent(SaveEventViewModel data, int student) 
{ 
    SaveEvent(data, student); // I am assuming this will occur 
    return JsonConvert.SerializeObject(data); 
} 

来定义视图模型的好处是,你可以那么轻松地访问所有的来自allData(客户端)的模型成员。

allData.Start 
allData.End 

只是想给一个替代方案,因为动态方法将工作正常 - 但我更喜欢ViewModel方法。

(请注意,JsonConvert来自Newtonsoft。Json库)