2011-12-02 13 views
104

Se scrivo in questo modo:Come scrivere "Html.BeginForm" in Razor

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

funziona.

Ma nel Rasoio 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> 
} 

mio regolatore di simile a questa:

[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'azione in realtà "immagini" o è "Carica/Upload"? –

+0

in realtà ho due controller. controller immagine con azione 'immagine' e controller di caricamento 'con azione di caricamento .. –

risposta

160

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 stai scrivendo questo codice dentro t Il contesto di altri costrutti lato server, ad esempio if o foreach, è necessario rimuovere @ prima dello 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 è interessato, ecco 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

grazie. Guarda il controller che ho aggiornato nella mia domanda. Non funziona con il codice Razor .. –

+2

@ user1076915, cosa significa * non funziona significa *? Potresti essere un po 'più specifico. Ho aggiornato la mia risposta con un codice di esempio su come potrebbe essere l'azione del controller. Se non riesci a ottenere il file caricato nell'azione del controller che potrebbe significare che hai nidificato tag '

' (che non è consentito in HTML) o potresti usare qualche javascript che dirotta il normale invio del modulo e fa una richiesta AJAX che non funziona con i caricamenti di file. –

+0

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) avrebbe potuto essere rimossa, il suo nome era cambiato, o è temporaneamente non disponibile. Controlla il seguente URL e assicurati che sia stato digitato correttamente. –