1

ここに奇妙な問題があります。ビューのjQueryからコントローラーのActionResultを呼び出します。

これがjQueryです

$(document).ready(function () {
    $('.addNoteLink').button();

    $('.addNoteLink').click(function () {
        var cid = $('#CaseID').val();
        var notetext = $('#NoteText').val();
        var url = "/Cases/AddNoteText";
        $.ajax({
        type: "POST",
        url: url,
        data: { id: cid, note: $('#NoteText').val() }
            });
    });
});

コントローラの方法は次のとおりです。

public ActionResult AddNoteText(int id, string note)
        {
        try
            {
            if (ModelState.IsValid)
                {
                CaseNotes notes = new CaseNotes
                {
                    CasesID = id,
                    NoteDate = DateTime.Now,
                    NoteText = note
                };
                db.CaseNotes.Add(notes);
                db.SaveChanges();
                }

            }
        catch 
            {

            }
        return RedirectToAction("Edit", id);
        }

jQueryに関連するhtmlは次のとおりです。

<div class="editor-label">
                    @Html.Label("Enter notes here and click Add Note Text")
                </div>
                <div class="textarea-field">
                    <input id = "NoteText" type="text" />
                </div>        
                @Html.ActionLink("Add Note Text", "AddNoteText", new { id = Model.CasesID }, new { @class = "addNoteLink" })

jQueryがこのメソッドを呼び出すとき、ブレークポイントをたどると、パラメーターが正しく渡され、ModelStateが有効になり、notesエンティティに入り、値などが割り当てられます。ブレークポイントがdb.CasesNotes.Add(notes)に達すると、ブレークポイントが関数の先頭に戻り、notesエンティティにヒットするまで再び下降し、db.SaveChanges()にジャンプしてから、再び先頭に戻り、メソッドを通過して、その時点までにパラメーターがクリアされているため、エラーが発生します。ただし、元のレコードは挿入されます。

何かご意見は?

4

1 に答える 1

1

jQueryクリックを使用してアンカーをサブスクライブする場合、リンクをクリックすると、ブラウザーは引き続きデフォルトのアクションを実行します(たとえば、リンクをたどります)。そのため、あなたの行動は2回呼び出されました。

ブラウザのデフォルトの動作をキャンセルするには、イベントオブジェクトでpreventDefault()を呼び出すために呼び出す必要があります。

$('.addNoteLink').click(function (event) {
    event.preventDefault();

    var cid = $('#CaseID').val();
    var notetext = $('#NoteText').val();
    var url = "/Cases/AddNoteText";
    $.ajax({
    type: "POST",
    url: url,
    data: { id: cid, note: $('#NoteText').val() }
        });
});
于 2012-06-28T15:19:50.487 に答える