【问题标题】:MVC Ajax.BeginForm OnSuccess function not definedMVC Ajax.BeginForm OnSuccess 函数未定义
【发布时间】:2011-07-30 08:04:49
【问题描述】:

我正在尝试让我的 Ajax.BeginForm 运行 OnSuccess 函数,但我一直在 firebug 中收到错误消息:

UpdateProjectDiv is not defined
 return Function.constructor.apply(null, argNames); 

表单如下所示:

<script type="text/javascript">
    $(document).ready(function () {

        function UpdateProjectDiv() {
            var projid = $("#ddlProjectsManage").val();

            $.post("/Manage/ProjectEmployeeList/", { projectid: projid }, function (data) {
                populateDiv($("#divProjectsToFill"), data);
            });
        }

        function populateDiv(div, data) {
            div.html('');
            div.append(data);
        }

    });
</script>

@using (Ajax.BeginForm("MoveToProject", new AjaxOptions { UpdateTargetId = "divAllEmployeesToFill", OnSuccess = "UpdateProjectDiv" }))
{
    [insert non-relevant code here] 

    <input id="btnMoveEmpsToProject" type="submit" value=">>"  />
    @Html.Hidden("SelectedProjectID","9999999999999")
}

我的控制器操作:

[HttpPost]
public ActionResult MoveToProject(UnassignedEmployeeBindingModel model, int selectedprojectId)
{
    var tempteam = _db.SpecTeams.SingleOrDefault(s => s.Name == "N/A" && s.ProjectId == selectedprojectId);

    try
    {
        foreach (var employee in model.UnassignedEmployees)
        {
            var employeeObj = _db.Employees.SingleOrDefault(e => e.Id == employee.Employee.Id);

            if (employee.IsSelected)
            {
                employeeObj.SpecTeamId = tempteam.Id;
                _db.SaveChanges();
            }
        }

        return RedirectToAction("UnassignedEmployeeList");
    }
    catch (Exception)
    {
        return RedirectToAction("Index");
    }
}

没有 OnSucess 代码可以正常工作,只是它不会自动刷新另一个部分 (#divProjectsToFill) 中的 div。

此外,它似乎在 jquery.unobtrusive-ajax.js 文件中而不是在页面本身上寻找函数 UpdateProjectDiv。我想我也许可以在那个文件中添加我的函数(虽然我还没有尝试过),但这听起来不是一个合适的解决方案。

谢谢!

【问题讨论】:

  • 您是否尝试在 $(document).ready() 之外定义您的 (JavaScript) 函数?
  • 不敢相信这么简单...谢谢!将其作为答案,以便我可以将其标记为已解决。 :)

标签: javascript jquery asp.net-mvc-3 razor


【解决方案1】:

$(document).ready(...) 事件处理程序之外破坏您的函数定义:

<script type="text/javascript">
    function UpdateProjectDiv() {
        var projid = $("#ddlProjectsManage").val();

        $.post("/Manage/ProjectEmployeeList/", { projectid: projid }, function (data) {
            populateDiv($("#divProjectsToFill"), data);
        });
    }

    function populateDiv(div, data) {
        div.html('');
        div.append(data);
    }

    $(document).ready(function () { /*... */});
</script>

【讨论】:

  • 能否请您给出原因,为什么我们需要打破 $(document).ready(...) 事件处理程序之外的函数定义???
  • @psylogic:如果你在$(document).ready(...) 中定义UpdateProjectDivUpdateProjectDiv 的作用域是你传递给ready 函数的函数,因此对 ASP.NET MVC 的 JavaScript 不可见.当您在 $(document).ready(...) 函数之外定义它时,它是全局的并且可用于 ASP.NET MVC。
  • @psylogic:很高兴为您提供帮助。我应该补充一点,创建这样的全局函数通常不是一个好习惯。更好的做法是使用“显示模块”模式之类的模式将函数放在命名空间中。
猜你喜欢
  • 1970-01-01
  • 2018-09-21
  • 2014-12-09
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2011-12-23
相关资源
最近更新 更多