Comment écrire «Html.BeginForm» dans Razor

133

Si j'écris comme ça:

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

Ça marche.

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>
}

Ma manette 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");
}
kk-dev11
la source
L'action est-elle réellement "images" ou est-ce "Upload / Upload"?
J.Steen
en fait, j'ai deux contrôleurs. contrôleur d'image avec action "image" .. et contrôleur de téléchargement "avec action de téléchargement ..
kk-dev11

Réponses:

200

Le code suivant fonctionne correctement:

@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'un autre côté, si vous écrivez ce code dans le contexte d'une autre construction côté serveur comme un ifou foreachvous 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, voici comment procéder :

[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");
}
Darin Dimitrov
la source
1
Merci. Regardez le contrôleur que j'ai mis à jour dans ma question. Cela ne fonctionne pas avec le code Razor ..
kk-dev11
2
@ user1076915, qu'est-ce que ça ne marche pas ? Pourriez-vous être un peu plus précis. J'ai mis à jour ma réponse avec un exemple de code illustrant à quoi pourrait ressembler 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 des <form>balises imbriquées (ce qui n'est pas autorisé en HTML) ou que vous utilisez peut-être du javascript qui détourne la soumission du formulaire normal et fait une requête AJAX qui ne le fait pas. t travailler avec les téléchargements de fichiers.
Darin Dimitrov
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 examiner l'URL suivante et vous assurer qu'elle est correctement orthographiée.
kk-dev11
@ user1076915, quand recevez-vous ce message d'erreur? Quand vous souhaitez rendre le formulaire de téléchargement ou lorsque vous soumettez le formulaire? Dans le premier cas vous assurer que vous avez une GETaction qui servira Télécharger la Upload.cshtmlvue contenant ce code: public ActionResult Upload() { return View(); }. Assurez-vous donc d'avoir un contrôleur appelé UploadControllercontenant les deux actions de téléchargement: une pour servir le formulaire et l'autre pour traiter la soumission.
Darin Dimitrov
2
Fonctionne, mais dans un contexte POST, je suggère d'ajouter: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze