在Asp .Net Web Api中使用对象

时间:2013-09-30 15:07:58

标签: c# asp.net object knockout.js 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就会导致智能感知错误。

获取其内容的正确方法是什么,我正在尝试做什么不可能?

3 个答案:

答案 0 :(得分:4)

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

但是,我建议你创建一个具有模型绑定属性的类。您必须在两个地方进行更改,然后才是真的,但是您可以获得IntelliSense等的所有优势。(此外,在大多数情况下,只需在不修改服务器端的情况下向客户端JavaScript代码添加更多属性可能就不够了。)

答案 1 :(得分: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。但它仍然会与您键入的类绑定。

答案 2 :(得分:0)

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

给定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);
}

定义ViewModel的好处是,您可以从allData(客户端)轻松访问模型的所有成员。

allData.Start
allData.End

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

(注意JsonConvert来自Newtonsoft.Json库)