Hay una mejor manera de hacer esto - utilice los parámetros integrados que se espera que la llamada OnSuccess pase
el construido en los parámetros (los que he encontrado hasta ahora de todos modos) son datos, estado y XHR
data = lo que retorno desde el método de la acción de estado
= si tiene éxito este estado es simplemente una cadena que dice "éxito"
xhr = objeto que apunta a un montón de cosas javascript que no voy a discutir ...
por lo que sería definir su javascript como esto (se puede dejar de lado los argumentos que no es necesario - ya que todo lo que queremos es nuestros datos de vuelta de la acción que acaba de tomar el argumento de datos)
function myOnSuccessFunction (data)
{
..do stuff here with the passed in data...
}
como he dicho antes, los datos JSON es todo lo que puede ser devuelto por el ActionResult así que si su método de acción del controlador se parece a esto ...
public ActionResult MyServerAction(Guid modelId)
{
MyModel mod = new MyModel(modelId);
mod.DoStuff();
return Json(mod, JsonRequestBehavior.AllowGet);
}
usted configurar su enlace de acción como esta ...
@Ajax.ActionLink("Do Stuff", "MyServerAction", new { modelId = Model.Id }, new AjaxOptions { OnSuccess = "mySuccessScript(data);", OnFailure = "myFailureScript();", Confirm = "Are you sure you want to do stuff on the server?" })
esto creará un cuadro de mensaje de confirmación que le preguntará si realmente desea invocar la acción - al hacer clic en sí en el indicador invocará la llamada al controlador - cuando la llamada regrese - el argumento de datos contendrá un objeto JSON lo que sea que hayas devuelto en tu método de acción. ¡Pan comido!
¡Pero espera! ¿Qué pasa si quiero pasar otro argumento personalizado? ¡Sencillo! Sólo tiene que añadir sus argumentos al frente de la lista ...
en lugar de esto ...
function myOnSuccessFunction (data)
{
..do stuff here with the passed in data...
}
hacer esto (se puede tener más de un argumento a medida, si te gusta, simplemente seguir añadiendo como necesario) ...
function myOnSuccessFunction (myCustomArg, data)
{
..do stuff here with the passed in data and custom args...
}
entonces en su configuración - acaba de obtener el argumento a través de algún script del lado del cliente dentro de su definición ActionLink ... es decir
@Ajax.ActionLink("DoStuff", "MyServerAction", new { modelId = Model.Id }, new AjaxOptions { OnSuccess = "mySuccessScript(myClientSideArg, data);", OnFailure = "myFailureScript();", Confirm = "Are you sure you want to do stuff on the server?" })
Tenga en cuenta que "myClientSideArg" en el parámetro OnSuccess puede provenir de donde lo necesite, simplemente reemplace este texto con lo que necesita.
Hope that Helps!
¿está seguro de que funciona? Obtengo un error de sintaxis cuando hago clic en un enlace que se creó con esta técnica. – montrealist
Muéstrame tu código, por favor –
tuve exactamente el mismo problema descrito en las versiones de 'depuración' y 'sin depuración', con exactamente los mismos errores, y probé tu método, y funcionó perfectamente para mí. ¿Por qué no pueden las personas vivas simplemente decirnos que llamemos a funciones como esta si es tan superficial y exigente con una llamada a función básica? malditos idiotas, ya perdí 4 horas de mi tiempo. ¡Pero gracias a Fujiy y al póster de preguntas por resolver otro error más sin sentido! y pensar, estoy usando vs2010 RTM !!!! –