2011-12-02 2 views
104

Si j'écris comme ceci:Comment écrire "Html.BeginForm" dans Razor

form action = "Images" method = "post" enctype = "multipart/form-data"

cela fonctionne.

Mais dans Razor avec '@' cela ne fonctionne pas. Ai-je fait des erreurs?

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
          new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset> 

     Select a file <input type="file" name="file" /> 
     <input type="submit" value="Upload" /> 

    </fieldset> 
} 

Mon contrôleur ressemble à ceci:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Upload() 
{ 
    foreach (string file in Request.Files) 
    { 
     var uploadedFile = Request.Files[file]; 
     uploadedFile.SaveAs(Server.MapPath("~/content/pics") + 
             Path.GetFileName(uploadedFile.FileName)); 
    } 

    return RedirectToAction ("Upload"); 
} 
+0

L'action est en fait "images" ou est-il "Upload/Upload"? –

+0

en fait j'ai deux contrôleurs. contrôleur d'image avec l'action 'image' .. et le contrôleur de téléchargement 'avec l'action de téléchargement .. –

Répondre

160

Le code suivant fonctionne très bien:

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
             new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     Select a file <input type="file" name="file" /> 
     <input type="submit" value="Upload" /> 
    </fieldset> 
} 

et génère comme prévu:

<form action="/Upload/Upload" enctype="multipart/form-data" method="post">  
    <fieldset> 
     Select a file <input type="file" name="file" /> 
     <input type="submit" value="Upload" /> 
    </fieldset> 
</form> 

D'autre part, si vous écrivez ce code à l'intérieur t Dans le contexte d'une autre construction côté serveur, par exemple if ou foreach, vous devez supprimer le @ avant le using. Par exemple:

@if (SomeCondition) 
{ 
    using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
             new { enctype = "multipart/form-data" })) 
    { 
     @Html.ValidationSummary(true) 
     <fieldset> 
      Select a file <input type="file" name="file" /> 
      <input type="submit" value="Upload" /> 
     </fieldset> 
    } 
} 

En ce qui concerne votre code côté serveur est concerné, voici how to proceed:

[HttpPost] 
public ActionResult Upload(HttpPostedFileBase file) 
{ 
    if (file != null && file.ContentLength > 0) 
    { 
     var fileName = Path.GetFileName(file.FileName); 
     var path = Path.Combine(Server.MapPath("~/content/pics"), fileName); 
     file.SaveAs(path); 
    } 
    return RedirectToAction("Upload"); 
} 
+1

merci. Regardez le contrôleur que j'ai mis à jour dans ma question. Il ne fonctionne pas avec le code Razor .. –

+2

@ user1076915, que signifie * cela ne fonctionne pas signifie *? Pourriez-vous être un peu plus précis. J'ai mis à jour ma réponse avec un exemple de code de l'action de votre contrôleur. Si vous ne parvenez pas à obtenir le fichier téléchargé dans l'action du contrôleur, cela pourrait signifier que vous avez imbriqué les balises '

' (ce qui n'est pas autorisé en HTML) ou que vous utilisez un javascript qui détourne la soumission normale et fait une requête AJAX qui ne fonctionne pas avec les téléchargements de fichiers. –

+0

J'ai utilisé votre action de contrôleur et le rasoir '@using' .. mais il affiche -> Description: HTTP 404. La ressource que vous recherchez (ou l'une de ses dépendances) aurait pu être supprimée, avait changé de nom, ou est temporairement indisponible. Veuillez vérifier l'URL suivante et assurez-vous qu'elle est épelée correctement. –