我有一些功能需要放在多个页面上,所以我将它作为部分视图实现。在表单发布期间绑定复杂对象
在这个部分视图中,我有一个下拉菜单,一个添加按钮和一个“项目”,每个项目都包含一个删除按钮。功能很明显。点击任何删除按钮删除相关项目,从下拉列表中选择一个项目,然后点击添加添加该项目。
复杂的是,这需要完全在JavaScript中发生 - 对项目列表的更改需要完全发生在客户端,并且在整个表单被提交之前服务器上不会发生任何事情。 (也就是说,我们不希望在每次更改时通过ajax更新服务器,我们希望收集更改并在提交表单时全部提交它们。)
第二个复杂性是该表单需要很漂亮大大减少,对父视图的要求尽可能少。
所以我创建了一个视图模型的部分:
public class ItemsModel
{
// The list to be displayed in the dropdown
public List<KeyValuePair<string, string>> itemsList { get; set; }
// The list of selected items
public List<string> items { get; set; }
public string itemsJson
{
get { return JsonConvert.SerializeObject(this.items); }
set { this.items = JsonConvert.DeserializeObject<List<string>>(value);
}
public ItemsModel()
{
this.itemsList = new List<KeyValuePair<string, string>>();
this.items = new List<string>();
}
}
而且页面的视图模型包含了这样一个实例:
public class MyViewModel
{
// Assorted stuff
public ItemsModel itemsModel;
}
当控制器构建模式,在HttpGet,它用两个列表填充ItemsModel对象。在页面视图包括部分,传递itemsModel:
@{Html.RenderPartial("_itemsList", Model.itemsModel);
在部分中,我们构建了下拉菜单:
@Html.DropDownList("itemsList", new SelectList(Model.itemsList, "Key", "Value")
我填充使用javascript:
var items = $.parseJSON('@Html.Raw(Model.itemsJson)');
var itemsUl = $('#itemsUl');
itemsUl.empty();
var iTemplate = $('#itemTemplate').html();
for (var i=0; i<items.length; i++)
{
var template = iTemplate.nformat("{item}": items[i]);
itemsUl.append($(template));
}
而且就我而言。我的意图是添加JavaScript来处理插入和删除,但在这一点上没有意义。因为当我提交包含未修改列表的页面时,MyViewModel.itemsModel为空。在网络上浏览左右,我已经看到了一些关于如何MVC结合请求项复杂的名单,但他们都不是有关我的问题的帖子,因为没有什么是找MVC被束缚。
我看过Fiddler,并且正在发送的请求包括“... & itemsList = & ...” - 它根本没有发送任何数据。
所以我想知道我是否完全追赶了错误的道路。在表单提交中包含复杂数据的正常方法是什么?我已经读过FormData(),但似乎只适用于Ajax风格的发送,它不影响正常的表单提交。
任何想法?