Come scrivere "Html.BeginForm" in Razor


133

Se scrivo così:

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

Funziona.

Ma in Razor con '@' non funziona. Ho fatto degli errori?

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

Il mio controller si presenta così:

[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");
}

L'azione è effettivamente "immagini" o è "Upload / Upload"?
J. Steen,

in realtà ho due controller. controller immagine con azione "immagine" .. e caricamento controller "con azione caricamento ..
kk-dev11

Risposte:


200

Il seguente codice funziona bene:

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

e genera come previsto:

<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'altra parte, se si sta scrivendo questo codice all'interno del contesto di un altro costrutto lato server come un ifo foreachè necessario rimuovere @prima il using. Per esempio:

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

Per quanto riguarda il codice lato server, ecco come procedere :

[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
Grazie. Guarda il controller che ho aggiornato nella mia domanda. Non funziona con il codice Razor ..
kk-dev11

2
@utente1076915, cosa significa che non funziona ? Potresti essere un po 'più specifico. Ho aggiornato la mia risposta con un codice di esempio di come potrebbe apparire la tua azione del controller. Se non riesci a ottenere il file caricato nell'azione del controller, ciò potrebbe significare che hai <form>tag nidificati (che non è consentito in HTML) o potresti utilizzare un javascript che dirotta l'invio normale del modulo e fa una richiesta AJAX che non ' t funziona con i caricamenti di file.
Darin Dimitrov,

Ho usato l'azione del controller e il rasoio '@using' .. ma visualizza -> Descrizione: HTTP 404. La risorsa che stai cercando (o una delle sue dipendenze) potrebbe essere stata rimossa, se il suo nome fosse cambiato o è temporaneamente non disponibile. Esamina il seguente URL e assicurati che sia stato digitato correttamente.
kk-dev11,

@ user1076915, quando viene visualizzato questo messaggio di errore? Quando si desidera eseguire il rendering del modulo di caricamento o quando si invia il modulo? Nel primo caso assicurarsi di avere un GETCarica azione che servirà la Upload.cshtmlvista contenente questo codice: public ActionResult Upload() { return View(); }. Quindi assicurati di avere un controller chiamato UploadControllercontenente le due azioni di caricamento: uno per servire il modulo e l'altro per elaborare l'invio.
Darin Dimitrov,

2
Funziona, ma in un contesto POST suggerisco di aggiungere: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.