如何将选择列表的选项发布到MVC操作方法?

时间:2011-07-26 18:11:23

标签: javascript jquery asp.net json asp.net-mvc-3

我正在尝试将选择列表中的所有项目提交给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。

2 个答案:

答案 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)