使用Chosen如何将所选值的数组作为字符串发布回控制器

时间:2015-05-01 14:54:46

标签: asp.net arrays asp.net-mvc asp.net-mvc-5 http-post

在选择选项中选择所有选定选项后,努力回到模型中。

在视图中:

<select id="GridRegions" multiple name="@Html.NameFor(model => model.GridRegions)">
    <option value=""></option>
    <option value="Centre">Centre</option>
    <option value="Inner">Inner</option>
    <option value="Outer">Outer</option>
</select>

在脚本块中:

$("#GridRegions").chosen().change(function (e, params) {
    values = $("#GridRegions").chosen().val();
    $("#GridRegions").val(values);
    console.log("Grid: " + $('#GridRegions').val());
});

控制台正确地写出所选的值,例如中心,内部但只有中心在表单帖子中传回,因为字段需要单个字符串。我已经关注了如何将数组转换为脚本中的字符串的大量示例,但它总是以某种方式出错。

获取values数组的最佳方法是什么,将其转换为逗号分隔的字符串并将其作为GridRegions的值传递给模型?我正在使用Entity Framework 6,因此GridRegions元素是Grading模型的一部分:

[HttpPost]
public ActionResult Form(Grading grading)
{
    if (ModelState.IsValid)
    {
        db.Gradings.Add(grading);
        db.SaveChanges();
    }
}

1 个答案:

答案 0 :(得分:0)

我终于找到了一个解决方法,也许不是最好的解决方案,但至少它对我有用,可能会帮助别人。我最终给选择列表提供了一个替代名称,并将数据传递回模型外部的操作:

ICollection<string> Grids

然后在动作中我将数组转换为字符串并将其分配给模型。

// stringify the multiselect arrays after check for null
if (Grids != null) 
{ 
    grading.GridRegions = String.Join(",", Grids); 
}

唯一需要注意的是,您无法根据模型中这些字段的数据注释进行验证检查,因为在执行ModelState.IsValid检查时,实际模型字段为NULL,因此需要进行额外的检查在行动中做出。