Jeśli napiszę tak:
form action = „Images” method = „post” enctype = „multipart / form-data”
to działa.
Ale w Razor z „@” to nie działa. Czy popełniłem jakieś błędy?
@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>
}
Mój kontroler wygląda tak:
[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");
}
forms
asp.net-mvc-3
razor
kk-dev11
źródło
źródło
Odpowiedzi:
Poniższy kod działa dobrze:
@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> }
i generuje zgodnie z oczekiwaniami:
<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>
Z drugiej strony, jeśli piszesz ten kod w kontekście innej konstrukcji po stronie serwera, takiej jak
if
lubforeach
, powinieneś usunąć@
przedusing
. Na przykład:@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> } }
Jeśli chodzi o kod po stronie serwera, oto jak postępować :
[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"); }
źródło
<form>
tagi (co jest niedozwolone w HTML) lub możesz używać javascript, który przechwytuje normalne przesyłanie formularza i wykonuje żądanie AJAX, które nie robi t pracować z przesyłaniem plików.GET
Upload działań, które będą służyćUpload.cshtml
widok zawierający ten kod:public ActionResult Upload() { return View(); }
. Upewnij się więc, że masz kontroler o nazwie, któryUploadController
zawiera dwie akcje przesyłania: jedną do obsługi formularza, a drugą do przetwarzania przesłania.