2009-04-27 13 views
34

Cuando uso:¿Puedo pasar un parámetro con el evento onSuccess en un Ajax.ActionLink

new AjaxOptions 
{ 
    UpdateTargetId = "VoteCount" + indx, 
    OnSuccess = "AnimateVoteMessage" 
} 

todo funciona bien ... pero estoy tratando de animar elementos de una lista, la de identificación asignados automáticamente. Como quiero que cada uno de estos sea direccionable desde mi javascript, creo que necesito pasar un parámetro a mi javascript. Pero cuando se utiliza:

new AjaxOptions 
{ 
    UpdateTargetId = "VoteCount" + indx, 
    OnSuccess = "AnimateVoteMessage(2)" 
} 

me sale un "Sys.ArgumentUndefinedException: Valor no puede ser indefinida". excepción. Bueno, lo entiendo cuando uso las versiones de depuración de MicrosoftMvcAjax.js. Cuando se utiliza la versión comprimida consigo un "error de ejecución Microsoft JScript: 'b' es nulo o no un objeto"

Así que mi pregunta es, ¿puedo pasar un parámetro a mi función javascript utilizando el evento OnSuccess para un ActionLink?

¿Es este el enfoque correcto? ¿De qué otro modo voy a tener una función de JavaScript que tenga la capacidad de ejecutar en 10 elementos (en mi caso, los ID de múltiples DIV) en mi página?

Respuesta

0

También encontré este problema ... ¡y no encontré la manera de resolverlo! Hice una solución alternativa (que no es buena pero la resolví por ahora ... tal vez hasta que alguien publique una solución aquí) ... lo que hice fue colocar un campo oculto en el div TargetId y OnSuccess llamé a un método js que recupera el valor del campo oculto < - esto podría suceder en su método AnimateVoteMessage ...

2

Utilice esta:

OnSuccess = "function(){yourfunction(" + productcode + ");}" 

o

OnSuccess = "function(){yourfunction(this, " + productcode + ");}" 
+0

¿está seguro de que funciona? Obtengo un error de sintaxis cuando hago clic en un enlace que se creó con esta técnica. – montrealist

+0

Muéstrame tu código, por favor –

+0

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 !!!! –

6

Prueba esto - que funciona para mí:

OnSuccess = "new Function('MyFunction(" + myParameter + ")')" 
+0

lo que sugirió funcionó perfectamente para mí, ya que tuve el mismo problema. gracias. –

29

o ... un poco diferente sintaxis que funcionó para mí:

OnSuccess = "(function() { MyFunction(arg1,arg2); })" 
+0

¡Eso funciona genial! Gracias por el consejo. –

+0

¡Excelente! Gracias por el consejo. – JasCav

+1

¿Cómo puedo obtener una referencia al ancla en el éxito? – Shimmy

0

Ver http://www.codeproject.com/KB/ajax/Parameters-OnSuccess.aspx

Básicamente:

function yourCallBack(arg1,arg2) { 
     return function(result) { // Your old function 
      alert(arg1); // param will be accessible here 
      alert(arg2); // param will be accessible here 
      alert(result);// result = the response returned from Ajax 
     }   
    } 
27

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!

+0

Tenga en cuenta que el orden de los parámetros en la llamada a la función en la propiedad 'OnSuccess' puede estar en cualquier orden, no es necesario poner ellos antes del argumento 'datos'. –

+0

Esta es una solución más nueva y aparentemente mejor que la respuesta de Mike. – Matthew

+0

Esta solución funciona bien porque le permite pasar 'datos, estado, xhr', así como sus propios parámetros personalizados. Acabo de probarlo y funciona como un encanto. – Alex

7

simplemente Puede hacer esto Razor

:

... OnSuccess = "AnimateVoteMessage('" + YourParameter + "')" 

Tenga en cuenta las comillas simples!

JavaScript:

function AnimateVoteMessage(YourParameter){ 
    alert(YourParameter); 
} 

Enjoy,

+0

¡Funciona! Gracias. –

8

Hay una mejor manera, que creo que es la forma en que Microsoft pretende: Establecer el AjaxOptions.OnSuccess a un puntero de función, es decir, sólo el nombre de la función, sin parámetros MVC le enviará los parámetros automágicamente. A continuación hay un ejemplo.parámetro

JScript:

función
public class ObjectForJScript 
{ 
    List<int> Ids { get; set; } 
} 

JScript:

function onFormSuccess(foobar){ 
    alert(foobar); 
    alert(foobar.Ids); 
    alert(foobar.Ids[0]); 
} 

Ver código: código

@using (Ajax.BeginForm("ControllerAction", "ControllerName", 
    new AjaxOptions 
     { 
      OnSuccess = "onFormSuccess" //see, just the name of our function 
     })) 
{ 
    @Html.Hidden("test", 2) 
} 

controlador:

public JsonResult ControllerAction(int test) 
{ 
    var returnObject = new ObjectForJScript 
     { 
      Ids = new List<int>{test} 
     }; 

    return Json(returnObject); 
} 

Tenga en cuenta que el nombre del parámetro en la función JScript no importa, no tiene que llamarlo "returnObject" aunque el controlador así lo denomine.

También tenga en cuenta que Json() convierte convenientemente nuestra Lista en una matriz JScript. Siempre que los métodos del objeto C# sean traducibles a Json, puede llamarlos en JScript como he hecho.

Finalmente, el controlador no tiene que devolver un JsonResult, puede ser ActionResult (pero generalmente es mejor tener una acción de controlador hacer una sola cosa).

El ejemplo anterior le alertará dos objetos (el JSON y el objeto Array que contiene), y luego 2.

Cuestiones relacionadas