我正在尝试将选择列表中的所有项目提交给MVC 3操作方法。这是我的Action方法:
[HttpPost]
public ActionResult SaveList(int SettingID, List<SelectListItem> items)
{
// blah...
}
以下是我尝试发送数据的简化版本:
var items = $("#listItems > option").map(function ()
{
var arr = [];
arr.push({ Value: $(this).val(), Text: $(this).text() });
return arr;
}).get();
$.ajax({
type: "POST",
url: "/CompanyAdmin/SaveSettingList/",
dataType: 'json',
data: { items: items, SettingID: SettingID},
success: function (msg)
{
alert(msg);
}
});
正确填充设置ID参数。并且List将使用正确的AMOUNT个项填充,但Text和Value属性都将为null。
我是否必须为jQuery安装一个JSON插件才能提交一系列项目?
编辑1:
按照Darin Dimitrov的建议,我使用了stringify方法,并将SettingID和选项列表作为JSON发送。
起初这不是我的Action方法,所以我将方法更改为:
public ActionResult SaveList(SaveSettingListModel json)
{}
将param定义如下:(以匹配JSON)
public class SaveSettingListModel
{
public int SettingID { get; set; }
public List<SelectListItem> items { get; set; }
}
这会激发正确的方法。 但是,服务器端的json内容为SettingID = 0(当我验证客户端为2时),items = null。
答案 0 :(得分:5)
尝试将其发布为JSON。
首先定义视图模型:
public class MyViewModel
{
public int SettingID { get; set; }
public List<SelectListItem> Items { get; set; }
}
然后修改您的控制器操作以将此视图模型作为参数:
[HttpPost]
public ActionResult SaveList(MyViewModel model)
{
// blah...
}
最后在你的剧本中:
var items = $('#listItems > option').map(function ()
{
var arr = [];
arr.push({ value: $(this).val(), text: $(this).text() });
return arr;
}).get();
$.ajax({
type: 'POST',
url: '/CompanyAdmin/SaveSettingList/', // <-- use an URL Helper to generate this url instead of hardcoding it or you will cry when you deploy your application into a virtual directory
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
items: items,
settingID: SettingID
}),
success: function (msg) {
alert(msg);
}
});
如果您想在旧版浏览器中使用JSON.stringify
方法,而不支持本机,请确保包含json2.js脚本。
所有这一切都说我看到你要使用这个控制器动作和这个AJAX请求,我必须说我不会这样做(在请求中发送选项)。我的意思是为了渲染这个视图,你从某个地方获取了这个列表?大概是一个数据存储区?因此,不要使用HTML <form>
(在提交时仅将下拉列表的选定值发送到服务器),为什么不在您的SaveList
操作中简单地使用这个相同的数据存储获取那些相同的选项?这样可以避免绕过它们并节省带宽。不要担心数据库很快。如果他们不在您的情况下,只需缓存昂贵查询的结果。
完全忽略我之前的评论,如果这些选项在客户端可能会发生变化,并且您想要获取新值。
答案 1 :(得分:0)