2010-01-07 6 views
5

Ich frage mich, wie würde ich das mit jQuery ajax tun. Jetzt habe ich eine jQuery-UI-Dialog-Popup und es hat eine HTML-Eingabedatei darauf. JetztWie lade ich eine Datei über jQuery hoch?

, wenn der Benutzer klickt importiert Ich mag eine Ajax-Post an den Server mit jQuery zu tun.

Ich bin nicht sicher, wie die Datei passiert in obwohl meine Aktion Ansicht.

Im Moment habe ich es einen vollständigen Beitrag tun zurück, so habe ich diesen

<% using (Html.BeginForm("Import", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{%> 
    <br /> 
    <p><input type="file" id="file" name="file" size="23 accept="text/calendar"></p><br /> 
    <p><input type="submit" value="Upload file" /></p>   

<% } %> 

Da ist in meinem Controller

public ActionResult Import(HttpPostedFileBase file) 

Also ich bin nicht sicher, wie in einem HttpPostedFileBase mit jQuery passieren und wie man in jQuery enctype = "multipart/form-data" setzt.

bearbeiten

Ok gut die jQuery Form Plugin scheint der Weg zu gehen zu sein.

$('#frm_ImportCalendar').livequery(function() 
{ 
    var options = { 
     dataType: 'json', 
     success: function(response) 
     { 
      alert(response); 
     } 
    }; 

    $(this).ajaxForm(options); 
}); 

Ich habe mich gefragt, warum meine Json nicht funktionierte aber jemand Sie erwähnt es nicht nur wie verwenden können. Ich überprüfe den anderen Link, wo jemand Json verwenden konnte.

Ich bin mir nicht sicher, warum in Lck verwendet .submit vor der Ajax-Methode einreichen.

bearbeiten

Wie kann ich das Datei-Upload-json Ergebnis ändere meinen Wörterbuch Array zurück?

 Dictionary<string, string> result = new Dictionary<string, string>(); 
     result.Add("Msg", "Success!!"); 
     result.Add("Body", calendarBody); 

// how can I change this? 
    return new FileUploadJsonResult { Data = new { message = string.Format("{0} uploaded successfully.", System.IO.Path.GetFileName(file.FileName)) } }; 

Antwort

0

Wie von Dominic vorgeschlagen, verwenden Sie die jQuery Form plugin. Das Formular, das Sie bereits erstellt haben, sollte bereits korrekt funktionieren. Fügen Sie einfach eine ID zu identifizieren:

<% using (Html.BeginForm("Import", "Controller", FormMethod.Post, new { id = "asyncForm", enctype = "multipart/form-data" })) 

und verwenden jQuery Formular die Daten zu schreiben:

$(document).ready(function(){ 
    $('#asyncForm').submit(function(){ 
     $(this).ajaxSubmit({ 
      beforeSubmit: function(){ 
       //update GUI to signal upload 
      } 
      data: { additional = 'value' }, 
      dataType: 'xml', 
      success: function(xml){ 
       //handle successful upload 
      } 
     }); 
    }); 
}); 

Beachten Sie, dass die Rückkehr Datentyp in Formen, die Dateien hochladen können nicht JSON sein. Verwenden Sie XML oder HTML als Antwort in der Methode Ihres Controllers.

+0

ich gerade hier kommen würde zu fragen, warum es JSON wird nicht zurückkehren lol. Ich habe etwas Ähnliches gemacht, aber ich habe keine ID .submit angegeben. Siehe Bearbeiten für das, was ich bisher habe. – chobo2

+0

Javascript kann JSON nicht als Datenformat für Anforderungen akzeptieren, die eine Datei aus Sicherheitsgründen hochgeladen haben (sie ist auf der jQuery Form-Webseite dokumentiert). Ich schlage vor, dass Sie XML verwenden, das _almost_ so einfach zu verwenden ist wie JSON mit jQuery ... oder vielleicht Werte im Klartext, die durch Zeilenumbrüche getrennt sind. Ich habe .ajaxSubmit explizit verwendet, weil ich das Beispiel von einem Code meines eigenen Projekts genommen habe, wo ich noch ein paar Sachen mit dem Formular mache. Sollte Ihrem Code trotzdem praktisch gleichwertig sein. – LorenzCK

+0

Nun, wie würde dieses XML aussehen? Ich habe meine Dictionary-Sammlung veröffentlicht, die ich in ein Json-Ergebnis umwandeln kann, wie ich sie in XML umwandeln kann. – chobo2

0

Ich konnte eine Datei über AJAX mit dem jQuery Form plugin hochladen und eine benutzerdefinierte JsonResult-Klasse wie beschrieben .

verwenden so etwas wie Ihr Wörterbuch

return new FileUploadJsonResult { Data = new { Msg = "Success!!", Body = calendarBody } }; 

zurückzukehren und Ihre Nachricht in der Callback-Funktion zu erhalten

success: function(result) { 
    $("#ajaxUploadForm").unblock(); 
    $("#ajaxUploadForm").resetForm(); 
    alert(result.Msg); 
} 
+0

Was ist $ .growlUI (null, result.message) ;? Ich bin mir nicht sicher, was GrowlUI ist und ob das etwas ist, was ich brauche. Muss ich iframe auch auf true setzen? – chobo2

+0

Auch was ist der Jason Schlüssel und Wert in diesem? Ist es Daten oder Nachricht? Siehe Bearbeiten. – chobo2

+0

Ja, iframe muss wahr sein. $ .growlUI ist nicht notwendig, es ist nur eine spezielle animierte Benachrichtigung. –