2011-07-14 12 views
1

私はチェックボックスリストとドロップダウンリストを持っています。私は、ドロップダウンリストから選択した値を渡し、チェックボックスをMVC3コントローラに渡し、モデルバインドを使用したいと思います。jQueryで複数のオブジェクトをMVC 3コントローラに送信

チェックボックスのためのViewModel:StateViewModel /Views/Home/EditorTemplates/StateViewModel.cshtmlため

public class StateViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Checked { get; set; } 
    public IEnumerable<TransitionViewModel> Transitions { get; set; } 
} 

エディタテンプレート:

@model Mcs.Sibs.UI.Web.Models.StateViewModel 

@Html.HiddenFor(x => x.Id) 
@Html.HiddenFor(x => x.Name) 
<div> 
    @Html.CheckBoxFor(x => x.Checked) 
    @Html.LabelFor(x => x.Checked, Model.Name) 
</div> 

マイビュー:コントローラにデータを送信している

@using (Html.BeginForm("GetSchedules", "Home", FormMethod.Post, new { id = "checkboxFrm" })) 
{ 
    @Html.EditorForModel() 
    <input id="ShowReportScheduleBtn" type="button" value="Show schedule" onclick="ShowReportSchedules()" /> 
} 

ボタンのクリックハンドラ:

function ShowReportSchedules() { 
    var selectedGenerationId = $('#SelectedGenerationId').val(); 
    var statesData = JSON.stringify($('#checkboxFrm')); 
    var statesData2 = $('#checkboxFrm').serialize(); //I also tried this 

     $.ajax({ 
      type: 'POST', 
      url: '/Home/GetSchedules', 
      data: { "generationId": selectedGenerationId, "states": statesData }, 
      dataType: "json", 
      contentType: 'application/json; charset=utf-8' 
     }); 
}; 

最後に、私のコントローラ:

[HttpPost] 
    public ActionResult GetSchedules(int generationId, IEnumerable<StateViewModel> states) 
    { 
     return View("Index"); 

は、私は私のコントローラに値を渡すことはできません。私はjQueryを使わずにstatesDataオブジェクトのみを渡し、私のフォームにはtype="submit"を使用しています。 statesDataとjQueryだけを渡そうとしたときに、type="button" FireBugに「JSONプリミティブが無効です」というエラーが表示されました。

整数+ statesDataオブジェクトを渡そうとすると、IE 9がクラッシュしてFirefoxがハングします。

私は様々なソリューションを試しましたが、成功しませんでした。

答えて

2

このようにしてみてください。

function ShowReportSchedules() { 
    var selectedGenerationId = $('#SelectedGenerationId').val(); 
    $.ajax({ 
     type: 'POST', 
     url: '@Url.Action("getschedules", "home")?generationId=' + selectedGenerationId, 
     data: { states: $('#checkboxFrm').serialize() }, 
     success: function(result) { 
      // Do something with the results 
     } 
    }); 
}; 
+0

OK、今私は例外を取得しない、generationIdは、コントローラに渡されますが、状態はありません。これは私が投稿メッセージに得たものです: 州=%255B0%255D.Id%3D1%26%255B0%255D.Name%3DObrada%26%255B0%255D.Checked%3Dfalse%26%255B1%255D.Id%3D2 %26%255B1%255D.Name%3DVerifikacija%26%255B1%255D.Checked%3Dtrue%26など。 –

+0

OK、「データ」から中括弧とパラメータ名を削除しても問題なく機能しました。これは次のようなものです: data:$( '#checkboxFrm')。serialize() これは正しく動作します(正しくシリアライズされています)。私はこの答えを正しいとマークしますが、jquery経由で複数のオブジェクトを送信する方法はありますか? –

0
var a = $("#a").serialize(); 
var b = $("#b").serialize(); 
var c = $("#c").serialize(); 


$.ajax({ 
      url: '@Url.Content("~/Controller/Method1")', 
      type: 'POST', 
      data: a+b+c, 
      success: function (success) { 
      // do something 
      } 
     }); 

// in Controller 
[HttpPost] 
public ActionResult Method1(abc a, bcd b, xyz c) 
{ 
} 

// where abc, bcd xyz are class 
関連する問題