93 votes

Comment obtenir une réponse ASP.NET MVC Ajax à rediriger vers une nouvelle page au lieu d'insérer view dans UpdateTargetId?

J'utilise de l'Ajax.BeginForm pour créer un formulaire, la volonté de faire une requête ajax publication à une certaine action de contrôleur et puis, si l'action est réussie, l'utilisateur doit être redirigé vers une autre page (si l'action échoue, un message d'état s'affiche à l'aide de la AjaxOptions UpdateTargetId).

using (Ajax.BeginForm("Delete", null,
        new { userId = Model.UserId },
        new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
        new { name = "DeleteForm", id = "DeleteForm" }))
   {
    [HTML DELETE BUTTON]
   }

Si la suppression est réussi je suis de retour d'une Rediriger le résultat:

[Authorize]
public ActionResult Delete(Int32 UserId)
{
    UserRepository.DeleteUser(UserId);
    return Redirect(Url.Action("Index", "Home"));
}

Mais la Maison de Contrôleur de la vue Index devient chargé dans le UpdateTargetId et donc je me retrouve avec une page dans une page. Deux choses que je pense à propos de:

  1. Soit je suis l'architecture de cette mal et doit gérer ce type de action différemment (pas à l'aide d'ajax).
  2. Au lieu de retourner une Redirection résultat, retour d'une vue qui a javascript qui ne l' redirection sur le côté client.

Quelqu'un aurait-il des commentaires sur #1? Ou si #2 est une bonne solution, ce serait la "redirection javascript vue"?

174voto

Ben Foster Points 11699

Vous pouvez utiliser JavascriptResult pour y parvenir.

Pour rediriger:

 return JavaScript("window.location = 'http://www.google.co.uk'");
 

Pour recharger la page en cours:

 return JavaScript("location.reload(true)");
 

Semble l'option la plus simple.

36voto

Vous pouvez retourner un JSON avec l'URL et le changement de la fenêtre.emplacement à l'aide de JavaScript côté client. Je préfère cette façon que l'appel d'une fonction JavaScript à partir du serveur, je pense qu'il est en train de briser la séparation des préoccupations.

Côté serveur:

return Json(new {result = "Redirect", url = Url.Action("ActionName", "ControllerName")});

Côté Client:

if (response.result == 'Redirect')
    window.location = response.url;

Bien sûr, vous pouvez ajouter plus logique, car il pourrait y avoir une erreur sur le côté serveur et dans ce cas, la propriété du résultat pourrait indiquer cette situation et éviter la redirection.

15voto

Valamas - AUS Points 8359

Bien que pas élégant, travaille pour moi dans certaines situations.

Manette

 if (RedirectToPage)
    return PartialView("JavascriptRedirect", new JavascriptRedirectModel("http://www.google.com"));
else
   ... return regular ajax partialview
 

Modèle

     public JavascriptRedirectModel(string location)
    {
        Location = location;
    }

    public string Location { get; set; }
 

/Views/Shared/JavascriptRedirect.cshtml

 @model Models.Shared.JavascriptRedirectModel

<script type="text/javascript">
    window.location = '@Model.Location';
</script>
 

13voto

Joseph Points 18099

Le comportement que vous essayez de produire n'est pas vraiment le mieux est d'utiliser AJAX. AJAX serait mieux utilisé si vous voulais seulement mettre à jour une partie de la page, pas complètement le rediriger vers une autre page. Cela va à l'encontre de l'objectif même de l'AJAX vraiment.

Je suggère de ne pas utiliser AJAX avec le comportement que vous décrivez.

Sinon, vous pouvez essayer d'utiliser Ajax de jquery, ce qui permettrait de soumettre la demande, puis vous spécifiez un rappel lors de la demande complète. Dans le callback, vous pouvez déterminer si elle a échoué ou réussi, et rediriger vers une autre page sur la réussite. J'ai trouvé Ajax de jquery à être beaucoup plus facile à utiliser, surtout depuis que je suis déjà à l'aide de la bibliothèque pour les autres choses de toute façon.

Vous pouvez trouver de la documentation à propos de jquery ajax ici, mais la syntaxe est comme suit:

jQuery.ajax( options )  

jQuery.get( url, data, callback, type)

jQuery.getJSON( url, data, callback )

jQuery.getScript( url, callback )

jQuery.post( url, data, callback, type)

1voto

Ryios Points 342

Je devais le faire parce que j'ai un formulaire de connexion ajax. Lorsque les utilisateurs se connectent avec succès, je redirige vers une nouvelle page et mets fin à la requête précédente car l'autre page gère la redirection vers la partie de confiance (car il s'agit d'un système STS SSO).

Cependant, je voulais aussi que cela fonctionne avec javascript désactivé, étant le saut de connexion central et tout, alors je suis venu avec cela,

     public static string EnsureUrlEndsWithSlash(string url)
    {
        if (string.IsNullOrEmpty(url))
            throw new ArgumentNullException("url");
        if (!url.EndsWith("/"))
            return string.Concat(url, "/");
        return url;
    }

    public static string GetQueryStringFromArray(KeyValuePair<string, string>[] values)
    {
        Dictionary<string, string> dValues = new Dictionary<string,string>();
        foreach(var pair in values)            
            dValues.Add(pair.Key, pair.Value);            
        var array = (from key in dValues.Keys select string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(dValues[key]))).ToArray();
        return "?" + string.Join("&", array);
    }

    public static void RedirectTo(this HttpRequestBase request, string url, params KeyValuePair<string, string>[] queryParameters)
    {            
        string redirectUrl = string.Concat(EnsureUrlEndsWithSlash(url), GetQueryStringFromArray(queryParameters));
        if (request.IsAjaxRequest())
            HttpContext.Current.Response.Write(string.Format("<script type=\"text/javascript\">window.location='{0}';</script>", redirectUrl));
        else
            HttpContext.Current.Response.Redirect(redirectUrl, true);

    }
 

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