2011-04-05 10 views
10

que estoy tratando de conseguir mi Ajax.BeginForm para ejecutar una función onSuccess pero me siguen dando en el quemador, el mensaje de error:función MVC Ajax.BeginForm onSuccess no define

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

Esto es lo que la forma se parece a:

<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") 
} 

y mi acción del controlador:

[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"); 
    } 
} 

Sin la OnSucess el código que funciona bien, excepto que hacer no se actualiza el div en otro parcial (#divProjectsToFill) automáticamente.

Además parece estar buscando la UpdateProjectDiv función en el archivo jquery.unobtrusive-ajax.js en lugar de en la propia página. Supongo que podría agregar mi función en ese archivo (aunque aún no lo he intentado), pero eso no parece una solución adecuada.

Gracias!

+3

¿Usted intentó definir sus funciones (JavaScript) fuera del '$ (document) ready()'? –

+0

No puedo creer que haya sido así de simple ... ¡Gracias! Ponlo como respuesta para que pueda marcarlo como resuelto. :) – LanFeusT

Respuesta

20

Divida sus definiciones de funciones fuera del manejador de eventos $(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> 
+0

¿podría dar la razón, por qué necesitamos romper las definiciones de función fuera del controlador de eventos $ (documento) .ready (...) ??? –

+2

@psylogic: Si define 'UpdateProjectDiv' dentro de $ (document) ready '(...)', 'UpdateProjectDiv' será de ámbito de la función que se pasa a la función' ready', y por lo tanto invisible para ASP. JavaScript de JavaScript MVC. Cuando lo define fuera de la función '$ (document) .ready (...)', es global y está disponible para ASP.NET MVC. –

+1

@psylogic: Me alegra ayudar. Debo agregar que generalmente no es una buena práctica crear funciones globales como esta. Una mejor práctica sería poner la función en un espacio de nombres usando un patrón como el patrón "revelar módulo". –

Cuestiones relacionadas