无法让我的大脑围绕如何为以下ASP.NET MVC 4 嵌套视图模型实现挖掘:
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
的EditorTemplate看起来像这样,有多个问题:
@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,显然Name应该是它的一部分,但其余的是列表,它们也包含列表。
如何映射?
如何处理它(一个进入下拉列表,它将是另一个列表的标签,长度可变 - 这是在这里使用敲除的唯一原因。)
一旦填写完毕,如何将它们放在一起并运回控制器行动?
当标签是名称标签的下拉列表(或组合框)时,如何编写该编辑器模型(例如:[label] home / work [name] email,[label] mobile / home / car [name ]电话)
如果它是内部有IList
的简单类 - 它类似于here。问题是列表中有列表,Knockout要求一切都是可观察的,不确定如何在java脚本中表达这种嵌套模型。
请帮忙。提前谢谢!
答案 0 :(得分:0)
我不会使用映射。我只是像这样声明ViewModel客户端:
//I'm asuming the properties for Label and Contact, this is just for example purposes
function LabelViewModel(){
var self = this;
self.LabelName = ko.observable();
}
function Contact(){
var self = this;
self.Name = ko.observable();
self.LastName = ko.observable();
}
//This is the definition for the List. I believe it shouldn't matter that the class names are different as long as the structure is the same
function ListViewModel(){
var self = this;
self.Labels = ko.observableArray();
self.Contacts = ko.observableArray();
}
function MainViewModel(){
var self = this;
self.Name = ko.observable();
self.List1 = ko.observableArray();
//....
self.List10 = ko.observableArray();
}
$(document).ready(function(){
var viewModel = new MainViewModel(@Html.Raw(JsonConvert.SerializeObject(Model)));
ko.applyBindings(viewModel);
});
然后,在提交时,我会尝试从jquery提交而不是直接进行http发布:
var viewModelJs = ko.toJS(ko.utils.unwrapObservable(viewModel));
var parameters = JSON.stringify({vm: viewModelJs});
$.ajax('http://yourControllerUrlHere', {
data: parameters,
type: "POST",
contentType: "application/json",
dataType: "json",
success: function (result) {
console.log('Submitted ok');
},
error: function (error) {
console.log(error);
}
});
答案 1 :(得分:0)
不得不重新解释这个问题,找出我遇到的问题,而不是像这里一样问一般问题。
非常感谢您努力回答,遗憾的是我发现,如果您没有正确地提出您的问题,您将分别获得常见(非特定)回复。这是我的坏事。
由于有很多人对我提出的问题感兴趣(在前3个小时有5个赞成票),我在这里就同样的问题强调了我所遇到的具体问题,得到了正确答案并得到了我的淘汰赛再次淘汰赛。
ASP.NET with Knockout variable length list with combobox - how to bind?
希望这有助于某人,因为它帮助了我和他再次感谢!