2015-10-14 9 views
5

誰かが行のビットフィールドを表すボックスをチェックしたときにデータベースを更新したいと思います。私はこの質問のオフに行くされています:MacroStatusControllerクラスでasp.net mvc checkboxトリガアクションを作成するにはどうすればよいですか?

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Macro_Name) 
    </td> 
    <td> 
     @Html.CheckBoxFor(modelItem => item.Claimed, new { id = item.Macro_Name, data_url = Url.Action("ToggleClaim", "MacroStatus")}) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Date_Claimed) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Username) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Finished) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Date_Completed) 
    </td> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { id=item.Macro_Name }) | 
     @Html.ActionLink("Details", "Details", new { id = item.Macro_Name }) | 
     @Html.ActionLink("Delete", "Delete", new { id = item.Macro_Name }) 
    </td> 
</tr> 
} 

私は、次のアクションを持っている:ここでAjax.ActionLink(...) with checkbox はCSHTMLファイルに私のコードです

public ActionResult ToggleClaim(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     MacroStatus macroStatus = db.MacroStatus1.Find(id); 
     if (macroStatus == null) 
     { 
      return HttpNotFound(); 
     } 

     if (ModelState.IsValid) 
     { 
      macroStatus.Date_Claimed = DateTime.Now; 
      db.Entry(macroStatus).State = EntityState.Modified; 
      db.SaveChanges(); 
     } 

     return new HttpStatusCodeResult(HttpStatusCode.OK); 
    } 

しかし、ToggleClaimではありませんチェックボックスをオンまたはオフにすると実行されます。コンパイルエラーはありません。これは私の最初の試みasp.net mvcで、何が間違っているのですか?

+0

'data-url'属性には現在いくつかのURLしか含まれていません。それを使用するJavascriptの一部が必要です。 – haim770

+1

これには数多くのアプローチがありますが、そのチェックボックスをオンにすると、サーバーエンドポイント(ASP.net MVCを使用しているためおそらくWeb APIメソッド)へのAJAX呼び出しを行う必要があります。 "迅速かつ汚れた"答えは、チェックボックスのためにjQueryセレクタを使用し、$([セレクタ])を使って関数を登録することです。change(function(){});また、チェックボックスを剣道のビューモデルやその他の方法でバインドすることもできます。 –

+0

こちらもご覧になれます:http://stackoverflow.com/questions/1784412/asp-net-mvc-simulating-autopostback-for-simple-checkbox –

答えて

5

これにはajaxが必要です。 まず、クラスをチェックボックスに追加して、クリックイベントをアタッチするフックを作成します。今すぐあなたのjavascriptを追加

@Html.CheckBoxFor(modelItem => item.Claimed, new { id = item.Macro_Name, @class = "toggle" data_url = Url.Action("ToggleClaim", "MacroStatus")})

@section scripts { 
    <script> 
     $(function() { 
      $('.toggle').change(function() { 
       var self = $(this); 
       var url = self.data('url'); 
       var id = self.attr('id'); 
       var value = self.prop('checked'); 

       $.ajax({ 
        url: url, 
        data: { id: id }, 
        type: 'POST', 
        success: function(response) { 
         alert(response); 
        } 
       }); 
      }); 
     }); 
    </script> 
} 
+0

、class = "toggle"は私にここで構文エラーを与えています。それはここで有効なキーワードですか? –

+0

申し訳ありませんが、クラスは予約語です。@ - '@class =" toggle "' – JB06

+0

@ JB06非常に良い+1;) –

0

チェックボックスがチェックされていない場合、&フォームが送信されます。チェックボックスに関連するフォームフィールドはsubmittedではありません。 Post the checkboxes that are uncheckedに記載されているように、JavaScriptを使用してhidden変数を追加するか、チェックボックスをオンにするとAjaxヒットにする必要があります。 jQuery Ajax checkbox state

1

チェック・ボックスが変更されたときに要点が送信されます。

コメントの中のEricに記載されているとおり、さまざまな方法でアクションをトリガーできます。例えば、あなたのコードでは、このスクリプトを置く:

<script> 
    $(function() { 
     $('#Claimed').change(function() { 
      $.ajax({ 
       url: '/ToggleClaim/MacroStatus/@item.Macro_Name', 
       cache: false, 
       method: 'GET', 
       success: function (data) { alert('success'); }, 
       error: function() { alert('error'); } 
      }); 
     }); 
    }); 
</script> 

、正しいチェックボックスコードこの方法:

<td> 
    @Html.CheckBoxFor(modelItem => item.Claimed) 
</td> 

上記のコードは、このチェックボックスをチェックしたりオフにするたびにアクションをトリガする、あなたは、単にすることができますチェックボックスがオンになっていることを確認して、ajaxリクエストを送信します。

+1

良い答え –

+0

@EricBurchamありがとう:) –

+0

あなたがしようとしているような正しいマクロ名を渡すには、これをforeachループの中に入れなければなりません。あなたはそうしてはいけません。 – JB06

関連する問題