2013-03-20 11 views
9

Sto utilizzando il controllo di caricamento dell'interfaccia utente Kendo. Ho definito l'upload Kendo UI in questo modo:Come ottenere il valore restituito dal successo di upload di kendoui o dalla funzione completa

<input type="file" name="resume" /> 
$("#file").kendoUpload({ 
    async: { 
     saveUrl: "/Home/SaveResume",    
     autoUpload: true 
     },    
     complete: function (e) 
     { 
      // here i want to get the text that is returned from the controller 
     } 
}); 

Il codice di controllo è simile:

public ActionResult SaveResume(HttpPostedFileBase resume) 
{ 
    var text; 
    // code for the file to convert to text and assign it to text 
    return Json(text, JsonRequestBehavior.AllowGet); 
} 

Dopo il ritorno il codice che voglio recuperare il codice nella funzione completa. Come lo posso fare?

+0

Hai provato a 'console.log (e)' per vedere quello che sta restituito? sono disposto a essere "e" non è un "evento" ma è piuttosto il "dato restituito dallo srever". Se usi 'var data = $ .parseJSON (e)' probabilmente finirai con un oggetto dati che ha proprietà come definito dal tuo controller. – Ohgodwhy

+0

Yah la variabile dati contiene la stringa come 'Server Response: the actual string'. – Pa1

+0

L'oggetto restituito 'è' un oggetto, hai usato parseJSON e non era l'oggetto che hai inviato? posta l'oggetto qui, usa jsfiddle e salvalo. – Ohgodwhy

risposta

5

si può ottenere la risposta alla funzione di successo come questo

function onSuccess(e) 
{ 
    var response = e.response.data(); 
} 

dove il jSON ritorno potrebbe essere

return json(new { data=text, "text/plain" }); 
+0

per favore vedere la risposta di nukefusion. 'E.response.data() 'non funziona. – 8protons

+0

Il tipo di contenuto della risposta deve essere 'text/plain' per restituire i dati al gestore eventi, incluso restituire un oggetto JSON. Qualsiasi altro tipo di contenuto verrà considerato come un errore. 'e.response.data()' dovrebbe essere 'e.response.data', poiché si prevede che la risposta sia un oggetto. Per restituire quell'oggetto che contiene una proprietà 'data' dal controller, il codice dovrebbe essere' return Json (new {data = text}, "text/plain"); '. – Suncat2000

7

Se solo passando una stringa di nuovo si dovrebbe essere in grado di fare:

function onSuccess(e) { 
    var text = e.XMLHttpRequest.responseText; 
} 

Si potrebbe anche passare di nuovo un oggetto più complesso, se necessario:

// Object 
public class MyObject 
{ 
    public int ID { get; set; } 
    public string Text { get; set; } 
} 

// Controller Action 
public virtual ActionResult Upload(HttpPostedFileBase file) 
{ 
    return this.Json(new MyObject(), "text/plain"); 
} 

// Javascript Handler 
function onSuccess(e) { 
    var response = jQuery.parseJSON(e.XMLHttpRequest.responseText); 
    var id = response.ID; 
    var text = response.Text; 
} 
+0

Abbiamo bisogno di restituire solo testo/semplice. possiamo inviare altri formati come html o xhtml – Pa1

1

Aggiungo la mia risposta accanto alle altre risposte valide qui. In primo luogo anche se si vuole ottenere la risposta restituito nella funzione di successo anziché la funzione completa:

 $("#files").kendoUpload({ 
     async: { 
      saveUrl: url, 
      removeUrl: removeUrl, 
      autoUpload: true 
     }, 
     select: onFileSelect,  // function for when a file is selected 
     success: onFileSuccess,  // function that returns response after upload 
     complete: onFileComplete, // function after success 
     remove: onFileRemove,  // function for when a file is removed 
     }); 

La sulla funzione successo restituisce un oggetto (normalmente la gente lo chiama e)

function onFileSuccess(e) { 

    console.log("e.response", e.response); 
    console.log("e.operation", e.operation); 
    console.log("e.XMLHttpRequest.status", e.XMLHttpRequest.status); 

    //e.operation is upload or remove 
    if (e.operation === "upload") { 
     // a file was added, get the response 
     var fileid = e.response; 
    } else { 
     // Do something after a file was removed 
    } 
} 

mia console voci di log restituiscono questi dati:

console.log values

questo è il modo in torno i miei dati dal server:

public HttpResponseMessage InsertTempFile() 
    { 
     HttpPostedFile file = System.Web.HttpContext.Current.Request.Files[0]; 

     //........ 
     // Code that adds my file to the database 
     // and generates a new primary key for my file 
     //......... 

     var response = new HttpResponseMessage(HttpStatusCode.OK); 
     response.Content = new StringContent(myNewId.ToString()); 

     return response; 
    } 

Il response.Content restituisce il mio nuovo ID nel e.response Il HttpStatusCode.Ok ritorna il mio stato di 200. C'è un sacco di altri dati restituiti e se si controlla la risposta.

notare che per utilizzare HttpResponseMessage e HttpStatuseCode è necessario includere i seguenti spazi dei nomi nella tua classe:

using System.Net.Http; 
using System.Net; 
Problemi correlati