2012-11-30 3 views
29

Mit Kendo UI in MVC4 Ich habe ein Grid die Ajax fordert Daten zurück in die Steuerung macht:Kendo: Behandeln von Fehlern in Ajax Datenanforderungen

public ActionResult SearchUser_Read([DataSourceRequest]DataSourceRequest request) 
    { 
     var data = CreateAnExcaptionHere(); 
     return Json(data.ToDataSourceResult(request)); 
    } 

Wie verwende ich dieser Anruf, um die Seite zu informieren, dass ein Fehler aufgetreten ist?

Antwort

36

Wenn Sie eine Fehlermeldung vom Server angezeigt werden, dann können Sie es tun, indem ein DataSourceResult Objekt Rückkehr mit nur seine Fehler Eigenschaftssatz:

return this.Json(new DataSourceResult 
      { 
       Errors = "my custom error" 
      }); 

Und es auf dem Client abholen durch mit diesem (bezogen von der .Events(events => events.Error("onError")) Linie):

function onError(e, status) { 
    if (e.status == "customerror") { 
     alert(e.errors); 
    } 
    else { 
     alert("Generic server error."); 
    } 
} 
+8

Ich empfehle Ihnen, den ModelState 'catch (Ausnahme exc) { ModelState.AddModelError (Zeichenfolge.Leer, exc.Message); return Json (neues UserModel [0]. ToDataSourceResult (request, ModelState)); } ' In diesem Fall können Sie den gleichen Fehlerhandler für die Validierung der Aktualisierungsaktion und die Aktionen zum Löschen \ Lesen verwenden. (weil während der Validierung Errorrs array [] [] und keine Zeichenkette sind) – Sergey

+3

Wenn Sie den ModelState als @Sergey verwenden, schlagen Sie vor, dass Sie 'e.errors [" "]. errors' im' onError (e, status) verwenden müssen 'Methode, um auf die Fehlerwerte zuzugreifen. Die Zeichenfolge im e.errors-Objekt ist der Schlüsselwert, den Sie an "ModelState.AddModelError" übergeben haben. Dann können Sie alle Fehler wie folgt durchlaufen und anzeigen: 'var errors = e.errors [" "]. Errors; var errorMessage; für (var i = 0; i iambdot

+1

@Drew Delano. Ich kann keine Eigenschaft "Fehler" in "DataSourceResult" finden. Bitte um Rat. –

2

Versuchen Sie, die Ausnahme auszulösen, und prüfen Sie, ob eine Warnmeldung angezeigt wird oder nicht.

Bei Kendo-Grid gibt es ein Fehlerereignis, das für Sie hilfreich sein kann.

http://docs.kendoui.com/documentation/getting-started/using-kendo-with/aspnet-mvc/migration/widgets/grid

Wir haben telerik mvc Gitter, die automatisch Alarmmeldungen anzeigt, ob es einen Fehler während bindend.

http://www.telerik.com/community/forums/aspnet-mvc/grid/exception-handling.aspx

http://www.telerik.com/community/forums/aspnet-mvc/grid/how-to-do-error-handling-in-gridaction-methods.aspx

+1

Unfortunatly, wird der Kendo Grid nicht Ausnahmen in den Griff Controller beim Zugriff auf Daten über Ajax scheint es. Ich frage mich, ob es eine Nachricht gibt, die wir zurücksenden können, dass es auf –

+0

abholen kann Wenn Sie das Raster manuell mit JQuery Ajax-Anforderungen binden, versuchen Sie, die Fehlermeldung von "Onexception" -Methode des Controllers zu senden. – Sunny

+0

Die letzten beiden Links sind nur Premium-Zugang. – Bardicer

24

es gefunden, unterstützt Kendo es nur um ein Ereignis zu der Datasource die JS-Funktion aufzurufen hinzufügen. Das ist es.

.DataSource(dataSource => dataSource 
     .Ajax() 
     .Events(events => events.Error("onError")) 
     .Read(read => read.Action("SearchUser_Read", "Search").Data("parentModel")) 
) 

<script> 
    function onError(e, status) { 
      alert("A server error has occurred!"); 
} 
</script> 
+0

Fehlt hier etwas? das erste Bit sieht nicht wie gültiges JS aus und die Großschreibung ist auch für JS falsch. –

+3

Nein, der obere Teil ist Standard Kendo im Razor-Format. Das alles macht Sinn und funktioniert. – Rethic

+1

Sie benötigen immer noch einen Mechanismus, um die Fehlerdaten vom Controller an das Grid weiterzuleiten, also ist leider mehr dahinter. – Suncat2000

9

um Drews Antwort nur ein wenig zu verlängern: wir die Veränderung wollen im Kendo Grid auch in der Regel ein Rollback w Wenn ein Fehler auftritt. Wenn ein Fehler beispielsweise beim Löschen eines Elements aus dem Raster angezeigt wird, wird er dennoch scheinbar gelöscht, obwohl der Fehler ausgelöst wurde und eine Meldung angezeigt wurde.

Diese Funktion löscht auch die Änderungen in allen Grids, die die Datenquelle verwenden, die einen Fehler warf:

function onError(e, status) { 

    // Cancel changes on any grids on the page that are using this data source 
    $('.k-grid').each(function (item) { 
     var grid = $(this).data("kendoGrid"); 
     if (e.sender === grid.dataSource) { 
      grid.cancelChanges(); 
     } 
    }); 

    if (e.status == "customerror") { 
     alert(e.errors); 
    } 
    else { 
     alert("Generic server error."); 
    } 

} 
+0

Um das spezifische Kendo-Gitter, das die Datenquelle veranlaßte, zu lesen, z. Nach der Sortierung können Sie '$ (e.sender.options.table.context) .data (" kendoGrid ")' 'verwenden. – Rhumborl

+0

@Rhumborl meine e.sender.options.table ist null. Irgendeine Idee warum das sein könnte? –

-1

Wie wäre es

throw new HttpResponseException(HttpStatusCode.BadRequest); 
Verwandte Themen