2010-12-20 12 views
9

Ich habe einen Controller implementiert, um neue Benutzer zu erstellen. Wenn der Benutzer erfolgreich erstellt wird, wird er an Index() weitergeleitet.Umleitung bei Erfolg und Fehler bei Ausfall anzeigen

Was ich will, ist erhalten umgeleitet, wenn alles in Ordnung ist, aber Aufenthalt in der aktuellen Seite und den Fehler sehen, wenn etwas gescheitert.

Ich verwende jQuery ajax mit MVC.

Mein Controller sieht wie folgt aus:

[Authorize] 
public ActionResult CreateUser(string username) 
{ 
    try 
    { 
     //here the logic to create the user 
    } 
    catch (Exception ex) 
    { 
     string error = string.Format("Error creating user: {0}", ex.Message); 
     Response.StatusCode = 500; 
     Response.Write(error);  
    } 
    return RedirectToAction("Index"); 
} 

Das Formular mit jQuery abgefangen einreichen wird, und dann wird der Anruf mit Ajax gemacht:

$("#new-user-form").submit(function() { 
    var form = $(this); 
    $.ajax({ 
    type: "GET", 
     url: form.attr('action'), 
     data: form.serialize(), 
     success: function(data, textStatus, xhr) { 
      //At this point I would like to redirect 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      $(".error-summary").html(xhr.responseText); 
     } 
    }); 

    //cancel the event 
    return false; 
}); 

Es funktioniert gut, wenn ein Fehler auftritt, aber Ich weiß nicht, wie ich den Erfolgsfall umsetzen soll.

Ich bin für andere Alternativen geöffnet.

+0

Ich habe eine ähnliche Situation. Ich habe eine Seite mit einem Formular zum Ausfüllen. Eine Schaltfläche auf der Seite ruft Daten aus einem Feld ab, ruft einen Webdienst auf, um verwandte Daten zu suchen, und leitet bei erfolgreicher Suche nach einer anderen Seite um. Ich benutze Ajax, um die Datenüberprüfung zu umgehen, da die validierten Felder nicht für die Nachschlageoperation der Schaltfläche gelten. Wenn die Suche fehlschlägt, möchte ich einen Fehler auf derselben Seite anzeigen. Zumindest würde es mir gefallen. – Suncat2000

Antwort

29

Wenn Sie in den Erfolg Aktion umleiten wollen, warum Sie AJAX verwenden? Der Zweck von AJAX besteht darin, nur Teile einer Site zu aktualisieren, ohne die gesamte Seite neu zu laden. Wenn Sie in der Erfolgsaktion umleiten, werden alle Ziele und Vorteile, die Sie von AJAX erhalten, komplett zunichte gemacht. Aber weil man hier gefragt, was Sie tun können:

[Authorize] 
public ActionResult CreateUser(string username) 
{ 
    ... 
    if (Request.IsAjaxRequest()) 
    { 
     return Json(new { redirectToUrl = Url.Action("Index") }); 
    } 
    return RedirectToAction("Index"); 
} 

Und dann:

success: function(data, textStatus, xhr) { 
    window.location.href = data.redirectToUrl; 
}, 
+0

@Darin: Ich bin nicht sicher, ob ich die Lösung verstehe, bitte können Sie erklären, wie es genau funktioniert? Vielen Dank! –

+1

@Daniel, in der Controller-Aktion überprüfen wir, ob diese Anfrage eine AJAX-Anfrage war ('Request.IsAjaxRequest') und wenn ja, geben wir ein JSON-Objekt zurück, das wie folgt aussieht:' {redirectToUrl = '/ home/index'} '. jQuery versteht JSON und wenn es es sieht, parst es es automatisch und übergibt es an den Parameter 'data', der an den' success' Callback übergeben wird. So haben Sie jetzt im Erfolgsrückruf Zugriff auf 'data.redirectToUrl', das gleich'/home/index' ist, und wir verwenden die 'window.location.href' Funktion, um den Browser auf diese URL umzuleiten. Aber wie ich in meinem Beitrag erklärt habe, ist das völlig nutzlos. –

+0

@Darin: Ich muss auf der Seite bleiben, wenn etwas fehlgeschlagen ist. Dies ist der Grund, warum ich AJAX verwende. Gibt es einen anderen besseren Weg, dies zu tun? –

0
window.location.href="url here" 

Moz Doc

+1

@Daniel: Die URL, zu der du gehen willst - es scheint, @Darin löst dieses Problem mit 'Url.Action (" Index ")' - ist das, wo du Erfolg haben willst? – Hogan

1

Hier ist eine alternative Antwort, die reine MVC Klassen verwendet und Sie keine Skript codieren oder verwenden jQuery . Zuerst fand ich die Validatoren von MVC 2 gut in Erfolg, Fehler und bestätigen Fälle, solange Sie sich erinnern:

1) Fügen Sie die erforderlichen MVC-Skripte (drei insgesamt plus EnableClientSideValidation Anruf - siehe MSDN).

2) Setzen Sie MetadataClassAttribute und RequiredAttributes auf Ihre Modell-/Datenentitäten. Sie müssen keine separaten Metadatenklassen erstellen und Ihr Modell nur teilweise referenzieren (ich finde diese Hosen), verweisen Sie einfach auf die gleiche Modellklasse im Attribut.

3) Lösen Sie die AJAX-Ausgabe umleiten, indem Sie JavaScript Rückkehr wie bereits vorgeschlagen (aber in einer Art und Weise jQuery orientiert) ...

ich es nur seltsames Verhalten bei der Validierung gelitten, wenn bereits aus der Liste Seite umleiten fehlgeschlagen eine Details/Seite bearbeiten. Die Fehlermeldungen erscheinen für ein paar Sekunden und verschwinden dann! Natürlich war es verwirrt, weil die Shell der Seite die erste Listenseite und der innere Inhalt von der Bearbeitungsseite war. Die Ursache des Problems lag also darin, dass das MVC 2-Toolkit nicht ordnungsgemäß von der ersten Seite umgeleitet wurde, und nicht, dass die Validierer auf der zweiten Seite nicht ordnungsgemäß funktionierten.

fand ich die gleiche Lösung hier:

http://craftycodeblog.com/2010/05/15/asp-net-mvc-ajax-redirect/ ... die ich in eine Erweiterung Methode und Klasse in VB erweitert.NET:

''' <summary> 
    ''' MVC extension methods. 
    ''' </summary> 
    Public Module MvcExtensions 

     ''' <summary> 
     ''' Returns an <see cref="AjaxAwareRedirectResult"/> for the specified action 
     ''' and optional controller name. 
     ''' </summary> 
     <Extension()> _ 
     Public Function AjaxAwareRedirectToAction(controller As Controller, _ 
             actionName As String, _ 
             Optional controllerName As String = Nothing) _ 
            As RedirectResult 

      ' Get target URL 
      Dim url = controller.Url.Action(actionName, controllerName) 

      ' Return AJAX aware redirect result 
      Return New AjaxAwareRedirectResult(url) 

     End Function 

    End Module 

    ''' <summary> 
    ''' <see cref="RedirectResult"/> which works with MVC 2 AJAX. 
    ''' </summary> 
    ''' <remarks> 
    ''' Normal redirects do not work with AJAX partial updates in MVC (HTTP 302 status). 
    ''' With MVC 2 AJAX it is necessary to return JavaScript to change the browser location. 
    ''' </remarks> 
    Public Class AjaxAwareRedirectResult 
     Inherits RedirectResult 

     ''' <summary> 
     ''' Creates an instance which redirects to the specified URL using 
     ''' a response containing either AJAX JavaScript or classic HTTPS 302 status. 
     ''' </summary> 
     ''' <param name="url">Target URL.</param> 
     Sub New(url As String) 
      MyBase.New(url) 
     End Sub 

     ''' <summary> 
     ''' Generates the response. 
     ''' </summary> 
     Public Overrides Sub ExecuteResult(ByVal context As ControllerContext) 

      ' Check if AJAX was used for request 
      If context.RequestContext.HttpContext.Request.IsAjaxRequest Then 

       ' Perform JavaScript redirect when AJAX is used 
       Dim destinationUrl As String = UrlHelper.GenerateContentUrl(Url, context.HttpContext) 
       Dim result As JavaScriptResult = New JavaScriptResult With { 
         .Script = ("window.location='" + destinationUrl + "';")} 
       result.ExecuteResult(context) 

      Else 

       ' Perform classic HTTP 302 status redirect 
       MyBase.ExecuteResult(context) 

      End If 

     End Sub 

    End Class 

Also dann haben Sie zwei Möglichkeiten. Sie können dem typischen MVC-Muster des Aufrufs von AjaxAwareRedirectToAction (aciton, [controller]) für MVC-Ziele folgen oder eine neue Instanz von AjaxAwareRedirectResult (url) zurückgeben, wenn Sie ein bestimmtes URL-Ziel berücksichtigen (d. H. Externe Site).

Ich war wirklich überrascht, dass Microsoft AJAX-Weiterleitungen in der ersten MVC 2 RTM nicht sortiert bekam. Ich muss MVC 2 in meinem aktuellen Projekt verwenden, weshalb ich unter dieser Einschränkung leiden muss, aber auch einige neuere MVC-Lösungen habe, die sich mehr in Richtung jQuery zur Validierung neigen. Ich werde es bald herausfinden, wenn sie es behoben haben.

1

Wenn Sie in der Erfolgsaktion umleiten, warum verwenden Sie AJAX? Der Zweck von AJAX besteht darin, nur Teile einer Site zu aktualisieren, ohne die gesamte Seite neu zu laden. Wenn, dass jeder Fehler oder Sitzung verfallen Sie gehen Standard-Login page.For umleiten, die Sie müssen AuthorizeAttribute außer Kraft setzen Filter so Klasse belew machen:

public class CheckAuthorization : AuthorizeAttribute 
{ 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (HttpContext.Current.Session["AFSUserId"] == null || !HttpContext.Current.Request.IsAuthenticated) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.StatusCode = 302; //Found Redirection to another page. Here- login page. Check Layout ajaxError() script. 
       filterContext.HttpContext.Response.End(); 
      } 
      else 
      { 
       filterContext.Result = new RedirectResult(System.Web.Security.FormsAuthentication.LoginUrl + "?ReturnUrl=" + 
       filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.RawUrl)); 
     } 
    } 
} 

Nachdem die CheckAuthorization Klasse Sie gerade haben setzen, wenn Sie Ajax-Aufruf Authorization wie unten:

[CheckAuthorization] 
public class BuyerController : Controller 
{ 
    [HttpGet()] 
    public ActionResult GetOrderlist() 
    { 
     return View(); 
    } 
} 

jetzt haben Sie ajax-Status 302 in Sichtseite auf jedem ajax-Aufruf behandeln so setzte Codezeile in Ihrer Layout-Seite, um von leadid desc einer bestimmten Seite, so wie unten:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
     if (jqXHR.status == 302) { 
      window.location.href = '@Url.Action("Login", "Home")'; 
     } 
    }); 

Hier sind Sie umleiten zur Login-Seite, wenn die aktuelle Sitzung oder Timeout abläuft.

Verwandte Themen