也许我的问题有一个简单的解决方案,但我似乎无法找到它。我已经阅读了很多关于Knockout的教程,所以我得到了基础知识,但我问这个问题,因为我的实体结构比一个有名字的人和一个朋友列表要复杂一点,这些朋友可能在Twitter上也可能不在Twitter (关于第9频道的视频:Helping you build dynamic JavaScript UIs with MVVM and ASP.NET)。这是我的情况:
我有一个基本结构 PersonnelClass 的课程:
[Serializable]
//The interface is for the implementation of 'Name' and 'Description'
public class PersonnelClass : IPersonnelClassOrPerson
{
public PersonnelClass() : this(Guid.NewGuid(), "", "") { }
public PersonnelClass(Guid id, String name, String description = null)
{
if (id == Guid.Empty) { throw new ArgumentNullException("id"); }
Id = id;
Name = name;
Description = description;
Properties = new PropertyCollection();
}
public Guid Id { get; private set; }
public String Name { get; set; }
public String Description { get; set; }
public PropertyCollection Properties { get; private set; }
}
PropertyCollection 类以及相关的 AbstractProperty 类如下所示:
[Serializable]
public class PropertyCollection: List<AbstractProperty> { }
[Serializable]
public abstract class AbstractProperty: IEntity, IProperty
{
public AbstractProperty(String name, String description = null) : this(Guid.NewGuid(), name, description) { }
public AbstractProperty(Guid id, String name, String description = null)
{
if (id == Guid.Empty) { throw new ArgumentNullException("id"); }
if (String.IsNullOrEmpty(name)) { throw new ArgumentNullException("name"); }
Id = id;
Name = name;
Description = description;
}
public Guid Id { get; private set; }
public String Name { get; private set; }
public String Description { get; private set; }
}
在我的Controller中,我创建了一个具有以下结构的 PersonnelClassViewModel 的实例:
public class PersonnelClassViewModel
{
public PersonnelClass PersonnelClass { get; set; }
public List<AbstractProperty> Properties { get; set; }
}
我用一个新的PersonnelClass填充这个viewmodel,并将两个test-properties传递给我的View,如下所示:
var properties = new List<AbstractProperty>
{
new TextProperty("prop1", "descr1"),
new TextProperty("prop2", "descr2")
//TextProperty is derived from AbstractProperty
};
var vm = new PersonnelClassViewModel { Properties = properties };
return View(vm);
我按照自己的意愿在视图中获取所有内容。从视图我想创建一个带有一组选定属性的新PersonnelClass。我有名称和描述的字段,并添加属性我有一个ListBox与已经存在的属性(为了演示目的,他们现在来自控制器)。通过一些Knockout JavaScript代码,我可以从此列表中选择项目,并使用所选属性填充HTML select-control()以添加到PersonnelClass。这一切都很好,直到我想建立一个对象传递回Controller并创建PersonnelClass。
我的问题是:需要什么Knockout JS代码才能构建此对象并通过提交表单将其传递给Controller,并且在我的Controller中我应该如何接收此对象,这意味着:什么类型对象应该是(PersonnelClass,PersonnelClassViewModel,...)?
如果需要更多信息/代码,请询问。提前谢谢!
回答'B Z'后更新:
我更多地遵循了Steven Sanderson关于此的教程,以确保我理解这一点,特别是你在答案中提供的那个。现在我在视图中有以下代码开始:
var initialData = @Html.Raw(new JavaScriptSerializer().Serialize(Model));
var viewModel = {
personnelClassViewModel : ko.mapping.fromJS(initialData),
properties : personnelClassViewModel.Properties,
selectedProperties : ko.observableArray([]),
addedProperties : ko.observableArray([])
};
ko.applyBindings(viewModel);
变量'initialData'包含我期望它具有的值但是我得到以下错误:
Microsoft JScript运行时错误:'personnelClassViewModel'未定义
我再也不知道了。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/
话虽如此,我认为你的问题不在于淘汰赛方面,更多的是关于如何在服务器端正确数据绑定数据。在上面的链接中,Steven使用FromJson属性来建模你可能会觉得有用的绑定......
HTH