1

我正在使用淘汰映射来帮助将服务器端对象映射到 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 中“编码”一个?这就是我使用淘汰赛映射的全部原因,所以我不必这样做。但是,我没有看到任何其他方式。

有没有办法从疫苗接种可观察数组访问基本疫苗接种对象,以便我可以创建一个新对象?

然后最后一个问题是,如何将其传递回我的控制器?我不确定这是否可行。

4

1 回答 1

0

你不能直接。但是您可以做的是在服务器端定义一个疫苗接种实例并将其作为默认实例返回。

因此,您需要返回旧数据和默认实例。

public ActionResult Load()
{
    ...
    var data = new {
         defaultVacination = new Vacination(),
         rambo =  rambo,
    };
    return Json(data , JsonRequestBehavior.AllowGet);
}

在客户端,您会收到相同的数据和默认实例。

var ViewModel = function (data) {
    var self = this;    
    ko.mapping.fromJS(data.rambo, {}, self);
    var defaultInstance =  data.defaultVacination;        
    ...      
     self.addVaccination = function () {
        // clone the default instance.
        self.Vaccinations.push(ko.utils.extend({}, defaultInstance));  

}

我希望它有所帮助。

于 2013-08-09T16:00:47.757 回答