2017-02-12 2 views
0

J'essaye de télécharger un fichier en utilisant AJAX en utilisant C# -Razor. Lorsque je soumets en cliquant sur le bouton, la méthode du contrôleur n'est pas en cours d'exécution. Comment puis-je resoudre ceci ?Télécharger le fichier à l'aide de MVC Razor à partir d'Ajax - Problème de logique débutant

Mon code est le suivant:

Voir

<div class="form-group"> 
    @Html.TextBoxFor(model => model.IMG, new { @class = "control-label col-md-12", type = "file", placeholder = "Industry", name = "files[]", id="FileUpload" }) 
    @Html.LabelFor(model => model.IMG, new { @class = "col-md-12 " }) 
    @Html.ValidationMessageFor(model => model.IMG) 
</div> 
<div class="form-group"> 
    <div class="col-md-offset-2 col-md-10"> 
     <input type="button" value="Create" class="btn btn-default" id="UseShipAddr" /> 
    </div> 
</div> 

AJAX

$('#UseShipAddr').click(function() { 
     var formData = new FormData(); 
     var totalFiles = document.getElementById("FileUpload").files.length; 
     for (var i = 0; i < totalFiles; i++) { 
      var file = document.getElementById("FileUpload").files[i]; 

      formData.append("IMG", file); 
      alert("h" + file); 
     } 
     formData.append("name", "James"); 
     formData.append("age", "1"); 

     $.ajax({ 
      url: "/Post/New", 
      type: "POST", 
      data: formData, 
      cache: false, 
      async: true, 
      success: function (data) { 
       alert(data); 
      } 
     }); 
    }); 

Contrôleur

[HttpPost] 
//[ValidateAntiForgeryToken] 
public async Task<ActionResult> New([Bind(Include="age","name","IMG")] POST rec) 
{ 
    if (ModelState.IsValid) 
     { 
     db.REC.Add(rec); 
     await db.SaveChangesAsync(); 
     return RedirectToAction("My", "Post"); 
     } 
    return View(rec); 
} 
+1

Est-ce que vous pointez sur l'adresse URI correcte, '"/Post/New "' et le nom de la méthode? 'Create'? – Satpal

+0

C'était une faute de frappe. Je l'ai corrigé maintenant. Le problème existe toujours. – Illep

+0

Vous ne définissez pas les bonnes options ajax, et vous pouvez simplement utiliser 'var formdata = new FormData ($ ('form'). Get (0));' pour sérialiser tout - se référer [cette réponse] (http: // stackoverflow .com/questions/29293637/how-to-append-ensemble-de-model-to-formdata-et-get-it-in-mvc/29293681 # 29293681) (et ensuite '.append()' si vous Envie d'envoyer des données supplémentaires qui ne sont pas dans un contrôle de formulaire –

Répondre

0

Envoyer les paramètres supplémentaires dans un querystring. Voici le code AJAX:

$.ajax({ 
    url: "/Post/New?name=James&age=1", 
    type: "POST", 
    data: formData, 
    cache: false, 
    async: true, 
    contentType: false, // Not to set any content header 
    processData: false, // Not to process data 
    success: function (data) { 
     alert(data); 
    } 
}); 

Et votre contrôleur devrait être similaire à ci-dessous:

public async Task<ActionResult> New(string name, int age) 
{ 
    try 
    { 
     foreach (string file in Request.Files) 
     { 
      var fileContent = Request.Files[file]; 
      if (fileContent != null && fileContent.ContentLength > 0) 
      { 
       // get a stream 
       var stream = fileContent.InputStream; 
       // and optionally write the file to disk 
       var fileName = Path.GetFileName(file); 
       using (var fileStream = new MemoryStream()) 
       { 
        stream.CopyTo(fileStream); 
       } 

       // File is in the memory stream, do whatever you need to do 
      } 
     } 
    } 
    catch (Exception) 
    { 

     // whatever you want to do 
    } 
} 
+0

Pouvez-vous également me montrer la partie HTML correspondante de votre code? – Illep

+0

Identique au vôtre. J'ai seulement changé la partie en $ .Ajax et le code du contrôleur. – CodingYoshi

+0

Merci pour la mise à jour. Laissez-moi essayer cela et revenir à vous. – Illep

0

Vous n'êtes pas une quelconque forme tout en créant la forme objet dans votre formulaire soumettre #UseShipAddr cliquez sur événement. S'il vous plaît indiquer votre formulaire tout en créant objet comme:

var formData = new FormData($(#formID)[0]); 

ou créer sous forme constructeur

var dataString = new FormData(); 

fichier append à la forme

dataString.append("UploadedFile", selectedFile); 
var form = $('#formID')[0]; 
var dataString = new FormData(form); 

envoyer maintenant cette chaîne à l'action dans le contrôleur.

Il y a beaucoup de problème dans votre demande. Enlevez d'abord ceci puis vous pourrez appeler cette action du contrôleur.

+0

Que voulez-vous dire? Pouvez-vous me montrer via un code si possible. Désolé, je suis un débutant. – Illep

+0

Non, ce n'est pas correct. Ce n'est pas comme ça que 'FormData' fonctionne. – CodingYoshi

+0

Je l'utilise pour télécharger le fichier avec certains paramètres dans l'appel ajax. Ce que je sais quand je passe l'objet complet des données de formulaire à l'action en utilisant l'appel ajax, sur l'action que j'ai besoin de nommer les paramètres avec le même nom que dans les noms de champs de formulaire. –