2012-11-30 22 views
29

Utilizzando Kendo interfaccia utente in MVC4 Ho un griglia che rende Ajax chiamate per i dati di nuovo nel controller:Kendo: Gestione degli errori in Ajax richiede dati

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

Come si usa questa chiamata per informare la pagina che c'è stato un errore?

risposta

36

Se è necessario visualizzare un messaggio di errore dal server, allora si può fare restituendo un oggetto DataSourceResult solo con i suoi errori insieme di proprietà:

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

E raccoglierlo sul client utilizzare questo (riferito dalla linea .Events(events => events.Error("onError"))):

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

Ti suggerisco di utilizzare ModelState 'catch (Exception exc) { ModelState.AddModelError (stringa.Empty, exc.Message); return Json (nuovo UserModel [0] .ToDataSourceResult (request, ModelState)); } In questo caso sarà possibile utilizzare lo stesso gestore degli errori per la convalida delle azioni Aggiorna e le azioni Elimina \ Leggi. (perché durante la convalida Erorrs è array [] [] e non una stringa) – Sergey

+3

se si utilizza ModelState come @Sergey suggerito si deve usare 'e.errors [" "]. errors' in' onError (e, status) 'metodo per accedere ai valori di errore. La stringa nell'oggetto e.errors è qualsiasi valore chiave fornito a 'ModelState.AddModelError'. Quindi è possibile scorrere e visualizzare tutti gli errori in questo modo: errori 'var errors = e.errors [" "]. var errorMessage; per (var i = 0; i iambdot

+1

@Drew Delano. Non riesco a trovare alcuna proprietà denominata "Errori" in "DataSourceResult". Per favore consiglio –

2

Provare ad aumentare l'eccezione e controllare se richiede o meno un messaggio di avviso.

Per la griglia di Kendo, c'è un evento di errore che potrebbe essere utile per voi.

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

Abbiamo usato griglie MVC Telerik che visualizza automaticamente i messaggi di avviso se c'è qualche errore durante vincolante.

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

Purtroppo, la Griglia Kendo non gestisce eccezioni nel Controller quando si accede ai dati tramite Ajax sembra. Mi chiedo se ci sia un messaggio che possiamo rispedire anche se potrebbe raccogliere su –

+0

Se si sta vincolando manualmente la griglia usando le richieste ajax di JQuery, provare a inviare il messaggio di errore dal metodo "onexception" del controller. – Sunny

+0

Gli ultimi due collegamenti sono solo di accesso premium. – Bardicer

24

Trovato, Kendo supporta il programma semplicemente con l'aggiunta di un evento per il DataSource la funzione JS da chiamare. Questo è tutto.

.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

C'è qualcosa che manca qui? il primo bit non assomiglia a JS valido e anche la maiuscola è sbagliata per JS. –

+3

No, la parte superiore è il Kendo standard che utilizza il formato Razor. Tutto ciò ha senso e funziona. – Rethic

+1

Hai ancora bisogno di un meccanismo per passare i dati di errore dal controller alla griglia, quindi purtroppo c'è ancora dell'altro. – Suncat2000

9

per estendere risposta solo un po 'di Drew: di solito si desidera eseguire il rollback alla variazione del Kendo griglia anche w quando si verifica un errore. Altrimenti, se viene generato un errore quando un elemento viene eliminato dalla griglia, ad esempio, apparirà comunque cancellato anche se l'errore è stato generato e un messaggio è stato mostrato.

Questa funzione annulla anche le modifiche in qualsiasi griglie che utilizzano l'origine dei dati che ha generato un errore:

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

Allo stesso modo, per ottenere la griglia di kendo specifica che ha causato la lettura dell'origine dati, ad es. che è stato ordinato, puoi usare '$ (e.sender.options.table.context) .data (" kendoGrid ")'. – Rhumborl

+0

@Rhumborl my e.sender.options.table è null. Qualche idea sul perché potrebbe essere? –

-1

Come su

throw new HttpResponseException(HttpStatusCode.BadRequest);