我正在使用淘汰赛,而我正在使用的模型中有很多项目。我将它发布到像这样的控制器:
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就会导致智能感知错误。
获取其内容的正确方法是什么,我正在尝试做什么不可能?
答案 0 :(得分:4)
如果要避免强类型(C#)模型类,可以使用dynamic
类型。
答案 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库)