【问题标题】:Using Chosen how to post array of selected values back to controller as string使用选择如何将选定值的数组作为字符串发布回控制器
【发布时间】:2015-05-01 14:54:45
【问题描述】:

努力将所选选择中的所有选定选项发回模型。

在视图中:

<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());
});

控制台正确地写出选定的值,例如Centre,Inner 但只有 Center 在表单帖子中被传回,因为该字段需要一个字符串。我遵循了 SO 中关于如何将数组转换为脚本中的字符串的大量示例,但它总是以某种方式出错。

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

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

【问题讨论】:

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


    【解决方案1】:

    使用 ajax,您可以将参数作为字符串数组添加到控制器操作中。

    [HttpPost]
    public ActionResult FooAction(string[] selectedValues )
    { 
        //do stuff
        return View();
    }
    

    先将选中的值读入一个对象,如下:

    var selectedValues = [];
    $(".GridRegions :selected").each(function() {
      selectedValues.push($(this).attr('value'));
    });
    

    然后发送如下:

       $.post("/controller/FooAction", { selectedValues  : selectedValues  });
    

    【讨论】:

    • 在这个特定的表单上有 14 个选择元素,所以我必须将 14 个不同的数组以及模型的其余部分传回控制器,然后我仍然需要转换将它们添加到那里的字符串中,然后在保存之前将它们添加到模型中。在脚本块中进行转换以便可以作为模型的一部分传回不是更好吗?
    • @user3632714 是的,您可以添加一个具有数组作为属性的模型,然后仍然使用上述内容发送它们。让我知道,我可以更新问题。将您的模型添加到问题中。
    【解决方案2】:

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

    ICollection<string> Grids
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2020-04-08
      • 2023-03-19
      相关资源
      最近更新 更多