mvc3 actionresult代码重复自己

时间:2012-06-28 13:54:58

标签: jquery asp.net-mvc-3 entity-framework

这是一个奇怪的问题。 我在视图中从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实体然后跳转到db.SaveChanges() 然后返回到顶部AGAIN,通过方法和错误输出,因为参数已被该点清除。插入原始记录。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您使用jQuery订阅锚点,则单击该链接时,浏览器仍将执行默认操作(例如,按照链接)。这就是你的行动召唤两次的原因。

您需要调用以调用事件对象上的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() }
        });
});