39 votes

Puis-je passer un paramètre avec l'événement OnSuccess dans un Ajax.ActionLink

Lorsque j'utilise:

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

tout fonctionne très bien...mais je suis en train d'animer des éléments dans une liste, avec automatiquement attribué ID. Car je veux que chacun d'entre eux adressable de mon javascript, je crois que j'ai besoin de passer un paramètre à mon javascript. Mais quand j'utilise:

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

Je reçois un " Sys.ArgumentUndefinedException: Valeur ne peut pas être indéfinie." l'exception". Eh bien, je reçois que lorsque vous utilisez les versions de débogage MicrosoftMvcAjax.js. Lors de l'utilisation de la version compressée j'obtiens "erreur d'exécution Microsoft JScript: 'b' a la valeur null ou n'est pas un objet"

Donc ma question est, puis-je passer un paramètre à ma fonction javascript à l'aide de l' OnSuccess pour l'événement ActionLink?

Est-ce la bonne solution? Sinon, comment vais-je avoir une fonction javascript ont la capacité de fonctionner sur 10 points (dans mon cas, l'Id de plusieurs DIVs) sur ma page?

31voto

Chase Points 131

Il ya une meilleure façon pour ce faire, utiliser le construit en paramètres que l'OnSuccess appel peut être devrait passer

construit dans les paramètres (ceux que j'ai trouvé pour l'instant en tout cas) sont données, le statut et le xhr

données = ce que vous êtes de retour de la méthode d'action

statut = en cas de succès ce statut est juste une chaîne de caractères qui dit que "la réussite"

xhr = objet qui pointe vers un tas de javascript trucs que je ne vais pas discuter...

si vous définissez votre javascript comme ceci (vous pouvez laisser de côté les arguments que vous n'avez pas besoin - depuis que nous voulons de nos données à partir de l'action, nous allons juste prendre les données de l'argumentation)

function myOnSuccessFunction (data)
{
   ..do stuff here with the passed in data...
}

comme je l'ai dit auparavant, les données est tout ce que JSON qui peuvent être retournés par l'ActionResult donc, si votre méthode d'action du contrôleur ressemble à ceci...

public ActionResult MyServerAction(Guid modelId)
{
   MyModel mod = new MyModel(modelId);

   mod.DoStuff();

   return Json(mod, JsonRequestBehavior.AllowGet);
}

vous devez définir votre lien d'action comme ça...

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

cela va créer une boîte de message de confirmation vous demandant si vous souhaitez invoquer l'action en cliquant sur oui à l'invite de l'appel au contrôleur - lorsque l'appel provient de retour - les données argument contient un objet JSON de ce que vous êtes retourné dans votre méthode d'action. Facile Comme Bonjour!

Mais attendez! Que faire si je veux passer à une autre coutume argument?! Simple! Ajoutez simplement vos arguments à l'avant de la liste...

au lieu de cela...

function myOnSuccessFunction (data)
{
   ..do stuff here with the passed in data...
}

le faire (vous pouvez avoir plus d'un personnalisé argument si vous le souhaitez, il suffit de garder les ajouter en tant que de besoin)...

function myOnSuccessFunction (myCustomArg, data)
{
   ..do stuff here with the passed in data and custom args...
}

puis dans votre installation - qui vient d'obtenir l'argument par certains script côté client, au sein de votre ActionLink définition... c'est à dire

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

Notez que "myClientSideArg" dans le OnSuccess paramètre peut venir de partout où vous en avez besoin - il suffit de remplacer ce texte par ce que vous avez besoin.

Espérons Que Ça Aide!

30voto

Mike Points 396

ou ... une syntaxe un peu différente qui a fonctionné pour moi:

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

9voto

Kam Points 160

Vous pouvez simplement le faire

Le rasoir:

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

Veuillez noter les guillemets simples!

JavaScript:

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

Prendre plaisir,

-Kam

9voto

Magnus Points 11

Il ya une meilleure façon, je crois que c'est la façon dont Microsoft l'a voulu: Définir la AjaxOptions.OnSuccess à un pointeur de fonction, c'est à dire juste le nom de la fonction, pas de paramètres. MVC envoyer les paramètres automatiquement. Ci-dessous est un exemple.

JScript paramètre:

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

Fonction Jscript:

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

Afficher le code:

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

Contrôleur de code:

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

    return Json(returnObject);
}

Notez que le nom du paramètre dans la fonction JScript n'a pas d'importance, vous n'avez pas à appeler "returnObject" même si le contrôleur de noms qu'il sorte.

Notez également que Json() idéalement tourne notre Liste dans un JScript tableau. Aussi longtemps que les méthodes de l'objet C# sont traduisibles en Json, vous pouvez appeler dans le JScript comme je l'ai fait.

Enfin, le contrôleur n'a pas à renvoyer un JsonResult, il peut être ActionResult (mais il est généralement préférable d'avoir un contrôleur de l'action juste une chose).

L'exemple ci-dessus va d'alerte de deux objets (le Json et le tableau d'objets qu'il contient), puis 2.

6voto

Alex42 Points 327

Essayez ceci - cela fonctionne pour moi:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X