0

チェックボックスの状態が変更されるたびに発生するチェックボックスのクリックイベントリスナーを含む私のビュー:

<html>
    <head>
        <script type="text/javascript" src="~/scripts/jquery.unobtrusive-ajax.js"></script>
        <script type="text/javascript" src="~/scripts/jquery-1.4.4.js"></script>

        <title>TestChckBox</title>
        <script type="text/javascript">
            $(function () {

                $(document).on("click", "input.chks", function (e) {
                    var _this = $(this);
                    var isChecked = _this.is(':checked');
                    $.post("@Url.Action("UpdateInput","Search")?id=" + _this.attr("id") +
                                          "&newValue=" + isChecked, function (data) {
                                              // response stuff should be here
                                          });

        });
    });

</script>


    </head>

--

       @if (ViewBag.SliceList != null)
        {
            @*foreach(Pirsum.Models.HourSlice slice in this.Model) {*@

            foreach (var slice in ViewBag.SliceList) {
                <div  class="row">


          <input class="chks" type="checkbox" id="@HtmlHelper.GenerateIdFromName("cb_slice." + @slice.SliceID)" />
                    <label for="@HtmlHelper.GenerateIdFromName("cb_slice." + @slice.SliceID)">@slice.SliceName</label>
                    <span class="info">@slice.StartTime - @slice.EndTime</span>

                </div>
            }
        }
              <input type="submit" value="Submit" />
       }
            </body>
        </html>

ビューバッグ内のアイテムをビューに渡すアクションから、いくつかのチェックボックスと文字列が div に正しく取り込まれます。

問題は、上記の関数が機能せず、チェックボックスがクリックされたり、クライアント側でクリックイベントが発生したりしたときに、検索コントローラーで「UpdateInput」が起動されないことです。

私は何を間違っていますか?また、チェックボックスの状態(チェックされているものとチェックされていないもの)をセッションで適切に保存するにはどうすればよいですか?または他のオプションで、ランタイムに設定されたチェックされたパラメーターを一時的に保存できますか?

参照用のコントローラーアクション、これはボディにデータを送信します(関連するチェックボックスと問題に関するその他のデータ)

public ActionResult TestChckbox()
{
    int iInstId = 1;

    Test.Models.DataLayer db = new Test.Models.DataLayer();
    Test.Models.TestDB.context = new Models.TestDB();

    IEnumerable<Test.Models.HourSlice> lst = db.GetSlices(context, iInstId).OrderBy(a => a.SliceID);
    ViewBag.SliceList = lst;
    return View(lst);
}

このアクションは、ボックスをチェック/チェック解除するときにチェックボックスの状態で実行する必要があります。

[HttpPost]
public ActionResult UpdateInput(int id, bool newValue)
{
    //do your saving here.
    return Json(true);
}
4

1 に答える 1

0

jQuery 1.4.4 を使用しています。onそのバージョンにはまだ存在しませんでした。bindjQuery のバージョンを使用またはアップグレードする必要があります。

それ以外の場合は、スクリプトを HTML の head に配置しないでください。配置する場合は、必ず でラップしてください$(document).ready()。また、デリゲートを のような高レベルのものにアタッチすることは非常に悪い考えdocumentです。すべての場所でクリックするたびに、jQuery が DOM にクエリを実行し、それが class のオブジェクトで発生したかどうかを確認します.chks。デリゲートを、回避できる絶対的に最も近い親にアタッチしたいと考えています。最後に、コードに基づいて、デリゲートも必要ありません。何かが DOM に動的に追加され、イベント ハンドラーをトリガーする必要がある場合にのみ、デリゲートを使用します。要素がページの読み込みからそこにある場合は、ハンドラーを ID またはクラスに直接アタッチします。

于 2013-05-02T14:32:16.880 に答える