JavaScript でデバッグすると、$("#widgetIds").val() の値が [1,2,3,4] などの int 値の配列であることがわかります。コントローラーに到達すると、widgetIds リストは null になります。私が試してみました:
- javascript で .serialize() と .serializeArray() を使用する
<string>
コントローラーで widgetIds タイプをリストに変更する- コントローラーで widgetIds タイプを int[] に変更する
- コントローラーで widgetIds タイプを string[] に変更する
- 機能しなかった、または事態を悪化させた何時間もの微調整
- グーグル
- モニターに向かって怒鳴る
- 拳を机に叩きつける
- ビール
注: この複数選択コントロールを使用しています。optgroup の理由は、複数選択で分離するためです。
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));
}