【问题标题】:HttpPost to Controller is null for e.preventDefault() in MVCMVC 中 e.preventDefault() 的 HttpPost 到控制器为空
【发布时间】:2014-05-08 12:31:04
【问题描述】:

我已经使用e.preventDefault(); 函数来限制 HttpPost 操作命中两次。使用提交按钮,系统调用e.preventDefault(); 函数。之后,View 将空对象返回给控制器。我已按照以下链接纠正 HttpPost 问题。

HttpPost action of a controller gets hit twice.

我该如何解决这个问题?

查看代码

@model EmployeeManagement.Model.EmployeeModel

@{
    ViewBag.Title = "EditEmployee";

}


<h2>Edit Employee</h2>
<div>

@using (@Html.BeginForm("EditEmployee", "Employee", FormMethod.Post, new { id = "EditEmployeeMsg" }))
{ 
    @Html.HiddenFor(a => a.employeeId)
   <div id="butonRight">
    <input type="submit" value="Save" />
    <input type="button" id="saveCancel" value="Cancel" />
   </div>

    <table>
        <tbody>
            <tr>
                <td>Title</td>
                <td>@Html.DropDownListFor(a => a.titleId, (IEnumerable<SelectListItem>)ViewBag.TitleEdit)</td>
            </tr>
            <tr>
                <td>First Name</td>
                <td>@Html.TextBoxFor(a => a.firstName)</td>
            </tr>
            <tr>
                <td>Last Name</td>
                <td>@Html.TextBoxFor(a => a.lastName)</td>
            </tr>
            <tr>
                <td>Email</td>
                <td>@Html.TextBoxFor(a => a.email)</td>
            </tr>
            <tr>
                <td>Date of Birth</td>
                <td>@Html.TextBoxFor(a => a.dateOfBirth, new { @class = "date_view", @Value = Model.dateOfBirth.ToString("dd/MM/yyyy") })</td>
            </tr>
            <tr>
                <td>Date of Join</td>
                <td>@Html.TextBoxFor(a => a.dateOfJoin, new { @class = "date_view", @Value = Model.dateOfJoin.ToString("dd/MM/yyyy") })</td>
            </tr>
            <tr>
                <td>Position</td>
                <td>@Html.DropDownListFor(a => a.positionId, (IEnumerable<SelectListItem>)ViewBag.PositionEdit)</td>
            </tr>
            <tr>
                <td>Division</td>
                <td>@Html.DropDownListFor(a => a.divisionId, (IEnumerable<SelectListItem>)ViewBag.DivisionEdit)</td>
            </tr>
            <tr>
                <td>Office</td>
                <td>@Html.DropDownListFor(a => a.locationId, (IEnumerable<SelectListItem>)ViewBag.OfficeLocEdit)</td>
            </tr>
            <tr>
                <td>Salary</td>
                <td>@Html.TextBoxFor(a => a.salary)</td>
            </tr>            
        </tbody>
    </table>

}
</div>

控制器代码

 [HttpPost]
    public ActionResult EditEmployee(EmployeeModel abcde)
    {
        bool updateResult = new EmployeeProvider().UpdateEmployee(abcde);            
        return Json(new { result = updateResult }, JsonRequestBehavior.AllowGet);

    }

jQuery 代码

$(document).ready(function () {

    $('#EditEmployeeMsg').submit(EditEmployeeMessage);

}
);

function EditEmployeeMessage(e) {

    e.preventDefault();
    $.ajax({
        type: this.method,
        url: this.action,
        data: $(this).serialize(),
        success: function (data) {
            if (data.result) {
                alert('Update Succesfully.');

            }
            else
                alert('Update Failed.');
        },
        error: function (data) {
            alert('Update Failed.');
        }
    });
}

【问题讨论】:

  • 您链接的问题是荒谬的(不是您的错,但它无助于解释您的问题)。在 javascript 中执行两次的操作通常(并非总是)表示意外添加了两次事件监听器。另外,请发布任何相关的代码示例,以便我们了解您的应用程序以及您想要完成的任务。
  • 能否请您粘贴您的代码,以便我们为您提供帮助。没有您的代码,我们无法凭空猜测解决方案。
  • 我已经编辑并发布了我的代码...,我使用的是 IE11
  • 您是否在浏览器控制台中看到任何错误?

标签: jquery asp.net-mvc


【解决方案1】:

也许您的问题与您的浏览器类型有关(例如,如果您使用的是 IE)。尝试将以下内容添加到您的代码中:

if (event.preventDefault) {
    event.preventDefault();
} else {
event.returnValue = false;
}

【讨论】:

  • 我添加了你的代码,但 IE 11 将 null 传递给控制器​​。它在 firefox 和 chrome 上工作......
  • 这听起来很奇怪,现在你的问题是动作被调用了两次还是视图模型没有正确绑定?如果它与被调用两次的动作有关,您是否尝试在 ajax 调用后将“return false”添加到函数的末尾?
  • 如果我使用 Firefox 或 chrome,那么系统会将值传递给控制器​​,但是当我使用 IE 11 时,系统会将空值传递给控制器​​。我使用了函数的“return false”结束,但是没有结果。
  • 嘿!尝试序列化表单本身并将其传递给 ajax 调用。如果您还检查序列化之后和将其传递给 ajax 调用之前的值是什么,这将有所帮助。
  • 感谢大家的cmets。我重置了IE然后问题就解决了。
猜你喜欢
  • 2012-08-09
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多