2011-06-30 3 views
2

En ce moment j'essaie d'avoir une fenêtre Ajax ouvrir une autre fenêtre à la fin. Fondamentalement, la première fenêtre demande si l'utilisateur veut faire quelque chose et la seconde lui dit qu'il a réussi. Le premier a besoin d'un oui ou non et le second a juste besoin d'un ok. Comment puis-je dire à Ajax Actionlink d'en ouvrir un autre quand c'est fait? Je travaille dans MVC 3 avec C#.Obtenir une action Ajax réussie pour ouvrir une autre fenêtre

En ce moment, mon ActionLink est:

@Ajax.ActionLink("Reset User Password", "ResetUserPW", "Admin", 
new { userName = Model.UserName }, 
new AjaxOptions { Confirm = "Reset Password?", HttpMethod = "HttpGet" }) 

Cela fonctionne très bien (je sais qu'il n'y a pas peu OnSuccess, ce fait est mentionné plus loin). Il exécute la logique fine et réinitialise le mot de passe de l'utilisateur. Je n'arrive pas à comprendre comment l'ouvrir pour ouvrir une autre fenêtre. Voici mon action de contrôleur:

public ActionResult ResetUserPW(string userName) 
    { 
     string newExcept; 
     MembershipUser user = Membership.GetUser(userName); 
     if (user != null) 
     { 
      try 
      { 
       string newPassword = Membership.GeneratePassword(8, 2); 
       if (user.ChangePassword(user.GetPassword(), newPassword)) 
       { 
        var mailMessage = new UserMailer(); 
        return PartialView(); 
        //return RedirectToAction("Users"); //Tried this return 
                  result, no go 
       } 
       else 
       { 
        const string ErroExcept = "There was an error processing your request (the password reset has failed). Please try again."; 
        ModelState.AddModelError("", ErroExcept); 
       } 
      } 
      catch (Exception ex) 
      { 
       newExcept = String.Format("There was an error processing your request({0}). Please try again.", ex.Message); 
       ModelState.AddModelError("", newExcept); 
      } 
     } 
     else 
     { 
      newExcept = "There is no record of the specified user in the database."; 
      ModelState.AddModelError("", newExcept); 
     } 
     return RedirectToAction("Users"); 
    } 

Il n'obtient jamais à la dernière ligne de code car il s'exécute correctement. Il n'y a pas d'étiquettes de données en haut, bien que j'ai essayé de changer le HttpMethod à un POST et en ajoutant la balise POST. Aussi, je suis très conscient qu'il n'y a pas OnSuccess ou OnCompletion dans ActionLink. J'ai essayé de mettre beaucoup de choses différentes là-dedans et je n'ai obtenu aucun résultat, alors je les ai coupés. Et après tout, toute la question est ce que je mets dans la zone OnSuccess =? Je ne suis pas très bon ou familier avec JQuery et je pense que c'est pourquoi c'est si difficile à résoudre pour moi. J'ai cherché exhaustivement et écrit des tonnes de différents types de code JQuery, mais je ne pouvais utiliser aucun d'entre eux avec le lien Ajax. L'action Controller accepte le nom d'utilisateur car l'administrateur fait cette action et devra le faire pour tous les utilisateurs (dit d'arrêter l'inévitable: "Vous pouvez obtenir le nom d'utilisateur de l'utilisateur avec l'instruction User.Identity.name"). Aussi, dites-moi si le découpage des exceptions et le code ModelState seraient utiles. Merci d'avance.

Solution finale:

public ActionResult ResetUserPW(string userName) 
{ 
    string newExcept; 
    MembershipUser user = Membership.GetUser(userName); 
    if (user != null) 
    { 
     try 
     { 
      string newPassword = Membership.GeneratePassword(8, 2); 
      if (user.ChangePassword(user.GetPassword(), newPassword)) 
      { 
       var mailMessage = new UserMailer(); 
       mailMessage.AdminPWReset(user.UserName, newPassword, user.Email.SendAsync(); 
       return Json(null); 
      } 
      else 
      { 
       ModelState.AddModelError("Password", "There was an error processing your request (the password reset has failed). Please try again"); 
      } 
     } 
     catch (Exception ex) 
     { 
      ModelState.AddModelError("Password", String.Format("There was an error processing your request ({0}). Please try again.", ex.Message)); 
     } 
    } 
    else 
    { 
     ModelState.AddModelError("Invalid User", "There is no record of the specified user in the database."); 
    } 

    if (!ModelState.IsValid) 
    { 
     return Json(GetModelStateErrors(ModelState)); 
    } 

    return Json(null); 
}  

Il n'y a pas de verbes en haut. GetModelStateErrors est défini comme tel:

private IEnumerable<ModelStateError> GetModelStateErrors(ModelStateDictionary dictionary) 
{ 
    foreach(var key in dictionary.Keys) 
    { 
     var error = dictionary[key].Errors.FirstOrDefault(); 
     if(error != null) 
      yield return new ModelStateError(key, error.ErrorMessage); 
    } 
} 

Et enfin, le lien Ajax est:

@Ajax.ActionLink("Reset User Password", "ResetUserPW", "Admin", 
new { userName = Model.UserName }, 
new AjaxOptions { 
    Confirm = "Reset Password?", 
    HttpMethod = "HttpGet", 
    OnSuccess="success" 
    }) 

Whoopsies, oublié d'ajouter le Javascript finale je. C'est le même que celui gramme dit:

<script type="text/javascript"> 
function success(data) { 
    alert('You have successfully reset the user\'s password!'); 
} 
</script> 

Répondre

1

Vous pouvez mettre un javascript rappel dans OnSuccess qui fonctionnera si l'appel AjaxLink retourne un état non-erreur, comme suit:

<script src="../../Scripts/jquery.unobtrusive-ajax.min.js"></script> 
<script type="text/javascript"> 
    function success(data) { 
     alert('Your password was reset'); 
    } 
</script> 

@Ajax.ActionLink("Reset User Password", "ResetUserPW", "Admin", 
    new { userName = Model.UserName }, 
    new AjaxOptions { Confirm = "Reset Password?", HttpMethod = "HttpPost", OnSuccess = "success" }) 

Mais vous besoin d'un moyen de retourner les erreurs de validation. Donc, je voudrais essayer quelque chose comme ceci:

[HttpPost] 
public ActionResult ResetUserPW(string userName) { 
    string newExcept; 
    MembershipUser user = Membership.GetUser(userName); 
    if (user != null) { 
     try { 
      string newPassword = Membership.GeneratePassword(8, 2); 
      if (user.ChangePassword(user.GetPassword(), newPassword)) { 
       var mailMessage = new UserMailer(); 
      } 
      else { 
       ModelState.AddModelError("Password", "There was an error processing your request (the password reset has failed). Please try again."); 
      } 
     } 
     catch (Exception ex) { 
      ModelState.AddModelError("Password", String.Format("There was an error processing your request({0}). Please try again.", ex.Message)); 
     } 
    } 
    else { 
     ModelState.AddModelError("Password", "There is no record of the specified user in the database."); 
    } 

    if (!ModelState.IsValid) 
     return Json(GetModelStateStateErrors(ModelState)); 

    return Json(null); 
} 

private IEnumerable<ModelStateError> GetModelStateStateErrors(ModelStateDictionary dictionary) { 
    foreach (var key in dictionary.Keys) { 
     var error = dictionary[key].Errors.FirstOrDefault(); 
     if (error != null) 
      yield return new ModelStateError(key, error.ErrorMessage); 
    } 
} 

avec un simple DTO pour ModelState:

public class ModelStateError { 
    public string Property { get; set; } 
    public string Error { get; set; } 

    public ModelStateError(string key, string value) { 
     this.Property = key; 
     this.Error = value; 
    } 
} 

S'il n'y a pas d'erreurs de validation, le paramètre data dans success sera nulle, sinon, il contiendra un tableau d'erreurs de validation que vous pouvez présenter à l'utilisateur comme vous le souhaitez.

+0

Génial! Ça a marché, la partie alerte était ce que je cherchais.Deux choses cependant, un: Y at-il un moyen pour moi de spécifier combien de temps cela prend pour que l'alerte apparaisse? La quantité de temps entre les deux semble plutôt aléatoire. Deuxièmement: Il y avait un problème dans votre code, pour une raison quelconque, en utilisant 'HttpMethod =" HttpPost "' ne fonctionnait pas, donc j'ai changé HttpMethod en 'HttpMethod =" HttpGet "' et abandonné: '[HttpPost]' du haut de l'Action, après que tout a fonctionné! Merci beaucoup! – hjc1710

Questions connexes