我正在使用淘汰映射来帮助将服务器端对象映射到 JSON。我有一个包含大量集合的对象,所以我不想在 javascript 中手动重新创建和映射每个部分。所以,我正在使用淘汰赛映射来为我做这件事。
我遇到了问题,所以我决定用一个简单的例子来试试,所以这是我为 ASP.NET MVC 应用程序所拥有的:
C# 模型:
public class Vaccinations
{
public string Vaccination { get; set; }
public System.DateTime VaccinationDate { get; set; }
}
public class Dog
{
public string Name { get; set; }
public int Age { get; set; }
public Dog()
{
this.Vaccinations = new System.Collections.Generic.List<Vaccinations>();
}
public System.Collections.Generic.List<Vacinations> Vacinations { get; set; }
}
如您所见,每只狗都有一份他们可能接种或未接种的疫苗接种清单。
在我的控制器中,我创建并返回一个预先填充的 Dog 对象:
public ActionResult Load()
{
Dog rambo = new Dog
{
Name = "Rambo",
Age = 5
};
rambo.Vacinations = new System.Collections.Generic.List<Vacinations> {
new Vacinations { Vacination = "Rabies", VacinationDate = DateTime.Now.AddYears(-1) },
new Vacinations { Vacination = "Mumps", VacinationDate = DateTime.Now.AddYears(-2) }
};
return Json(rambo, JsonRequestBehavior.AllowGet);
}
在我看来(Index.cshtml),我设置它以显示狗和它的疫苗接种列表。我想允许用户单击“添加疫苗接种”按钮以向集合中添加新行并允许他们输入数据。
同样,我正在使用 knockout.mapping 为我做映射。在 javascript 部分,这就是我所拥有的:
var ViewModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
self.isValid = ko.computed(function () {
return self.Name().length > 3;
});
// Operations
self.save = function () {
$.ajax({
url: "Dog/Save",
type: "post",
contentType: "application/json",
data: ko.mapping.toJSON(self),
success: function (response) {
alert(response.Status);
}
});
};
self.addVaccination = function () {
self.Vaccinations.push(new self.Vaccination()); // <--- This doesn't work and I know why, so how do I do this?
}
};
$(function () {
$.getJSON("Dog/Load", null, function (data) {
ko.applyBindings(new ViewModel(data));
});
});
我的问题围绕着我添加到 ViewModel 对象的“addVaccination”函数。如何指定一个新的“疫苗接种”对象而不必在 Javascript 中“编码”一个?这就是我使用淘汰赛映射的全部原因,所以我不必这样做。但是,我没有看到任何其他方式。
有没有办法从疫苗接种可观察数组访问基本疫苗接种对象,以便我可以创建一个新对象?
然后最后一个问题是,如何将其传递回我的控制器?我不确定这是否可行。