我无法理解如何在 ASP.NET MVC 4 的嵌套视图模型中实现 knockout :
public class MyProfile
{
public string Name { get; set; }
public IList<VM1> List1 { get; set; }
public IList<VM2> List2 { get; set; }
....
public IList<VM10> List10 { get; set; }
}
// example of VM view model
public class VM1
{
IList<Label> Labels { get; set; }
IList<Contact1> Contact1 { get; set; }
}
在我看来,我接受这样的模型:
@model MyProfile
@using (Html.BeginForm("Index", "Profile", FormMethod.Post, new { id = "profileEditorForm" }))
{
@Html.ValidationSummary(false)
<fieldset>
<legend>User's data</legend>
<label for="name">Name:</label>
<input type="text" id="name" name="name" class="required" data-bind="value: Name"/>
</fieldset>
@Html.EditorFor(m => @Model.List1, "List1") @* Editpr model for List1*@
@Html.EditorFor(m => @Model.List2, "List2")
.....
@Html.EditorFor(m => @Model.List10, "List10")
<p>
<input type="submit" value="Save" data-bind="enable: (List1().length > 0) && (List2().length > 0) && ...(List10().length > 0)" />
<a href="/">Cancel</a>
</p>
}
如果有多个问题,List1
的编辑模板将如下所示:
@model IList<FiveW.ViewModels.List1>
<fieldset>
<table>
<tbody data-bind="foreach: Contact1">
<tr>
<td>
<label>Email:</label></td>
<td>
@* How do you put combobox here with labels here?
How do you tie selected label to selected property on your Contact1 object *@
@*<select data-bind="options: Labels, optionsText: 'LabelName', value: selectedLabel, optionsCaption: 'Choose...'"></select></td>
<td>
<input type="text" data-bind="value: Name, uniqueName: true" class="required" /></td>
<td>
<a href="#" data-bind="click: function() { viewModel.removeContact1(this); }">Delete</a></td>
</tr>
</tbody>
</table>
<button data-bind="click: addContact1">Add Contact1</button>
</fieldset>
编辑
VM1到VM10除了验证逻辑外都是相同的,因此我必须将它们作为不同的类(不幸的是,在模型和视图中存在大量重复)。
客户端 - 这就是我要问的内容: 我需要从ASP MVC模型传递包含嵌套列表的数据,并在客户端使用knockout呈现它们(我发现它在处理动态列表方面做得最好)。 这类似于gmail联系人 - 您有家庭/工作/移动/传真电话 - 因此一个列表是电话的标签(是哪个电话),应该作为下拉框呈现,另一个是可变长度的电话动态列表,可以根据用户点击增加。
结束编辑
我不明白如何从这个嵌套模型创建knockout viewModel,显然名称应该是其中的一部分,但其余部分都是列表,它们还包含列表。
如何进行映射?
如何处理它(一个进入下拉列表,将成为另一个列表的标签,后者的长度是可变的 - 这里唯一使用knockout的原因)?
填写完毕后,如何将它们全部组合在一起并发送回控制器操作?
当标签是下拉列表(或组合框)时,如何编写编辑器模型(示例为:[label]home/work [name]email,[label]mobile/home/car [name]phone)
如果它是带有IList
的简单类 - 就像这里一样。问题是列表中还有列表,Knockout要求所有内容都是可观察的,不确定如何在JavaScript中表达此嵌套模型。
请帮忙。谢谢!