0

当我在 javascript 中调试时,我看到 $("#widgetIds").val() 的值是一个 int 值数组,例如 [1,2,3,4]。当它到达控制器时,widgetIds 列表为空。我努力了:

  • 在 javascript 中使用 .serialize() 和 .serializeArray()
  • 将 widgetIds 类型更改为<string>控制器上的 List
  • 在控制器上将 widgetIds 类型更改为 int[]
  • 在控制器上将 widgetIds 类型更改为 string[]
  • 几个小时的小调整没有奏效或让事情变得更糟
  • 谷歌
  • 对着我的显示器大喊大叫
  • 把我的拳头砸在我的桌子上
  • 啤酒

注意:我正在使用这个多选控件。optgroups 的原因是为了在多选中分离。

JavaScript

function ProcessButtonClick(){
$.post(processWidgetsUrl, { widgetIds: $("#widgetIds").val() });
}

看法

<select id="widgetIds" name="widgetIds" multiple="multiple">
    <optgroup label="Big Widgets">
        @foreach (var widget in Model.Widgets.Where(d => d.WidgetCategoryId == 1))
        {
            <option value="@widget.Id">@widget.DisplayName</option>
        }
     </optgroup>

     <optgroup label="Little Widgets">
         @foreach (var widget in Model.Widgets.Where(d => d.WidgetCategoryId == 3))
         {
             <option value="@widget.Id">@widget.DisplayName</option>
         }
     </optgroup>

     <optgroup label="Red Widgets">
         @foreach (var widget in Model.Widgets.Where(d => d.WidgetCategoryId == 4))
         {
             <option value="@widget.Id">@widget.DisplayName</option>
         }
     </optgroup>

     <optgroup label="Blue Widgets">
         @foreach (var widget in Model.Widgets.Where(d => d.WidgetCategoryId == 5))
         {
             <option value="@widget.Id">@widget.DisplayName</option>
         }
     </optgroup>

     <optgroup label="Round Widgets">
         @foreach (var widget in Model.Widgets.Where(d => d.WidgetCategoryId == 6))
         {
             <option value="@widget.Id">@widget.DisplayName</option>
         }
     </optgroup>

     <optgroup label="Square Widgets">
         @foreach (var widget in Model.Widgets.Where(d => d.WidgetCategoryId == 7))
         {
             <option value="@widget.Id">@widget.DisplayName</option>
         }
     </optgroup>
 </select>

控制器

public virtual ActionResult ProcessWidgets(List<int> widgetIds)
{
    return Json(_widgetComponent.DoStuff(widgetIds));
}
4

1 回答 1

1

您需要告诉服务器您正在向它发送 Json,然后 ASP.NET MVC 将知道如何在将数据发送到控制器之前正确解释数据:

function ProcessButtonClick(){
  $.post(processWidgetsUrl, { widgetIds: $("#widgetIds").val() }, null, "json");
}

您可能需要将数组转换为正确的 JSON如何使用 JSON、jQuery 将复杂对象数组发布到 ASP.NET MVC 控制器?

于 2013-02-03T04:29:02.573 回答