Wie schreibe ich "Html.BeginForm" in Razor

132

Wenn ich so schreibe:

form action = "Images" method = "post" enctype = "mehrteilig / Formulardaten"

Es klappt.

Aber in Razor mit '@' funktioniert es nicht. Habe ich Fehler gemacht?

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

Mein Controller sieht folgendermaßen aus:

[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
quelle
Ist die Aktion tatsächlich "Bilder" oder "Hochladen / Hochladen"?
J. Steen
Eigentlich habe ich zwei Controller.
Bildcontroller mit

Antworten:

200

Der folgende Code funktioniert einwandfrei:

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

und generiert wie erwartet:

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

Auf der anderen Seite , wenn Sie diesen Code in Zusammenhang mit anderem Server - Seite Konstrukt wie ein schreiben ifoder foreachsollten Sie das entfernen , @bevor der using. Beispielsweise:

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

In Bezug auf Ihren serverseitigen Code gehen Sie wie folgt vor :

[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
quelle
1
Vielen Dank. Schauen Sie sich den Controller an, den ich in meiner Frage aktualisiert habe. Es funktioniert nicht mit dem Razor-Code ..
kk-dev11
2
@ user1076915, was bedeutet das nicht ? Könnten Sie etwas genauer sein. Ich habe meine Antwort mit einem Beispielcode aktualisiert, wie Ihre Controller-Aktion aussehen könnte. Wenn Sie die hochgeladene Datei in der Controller-Aktion nicht abrufen können, kann dies bedeuten, dass Sie verschachtelte <form>Tags haben (was in HTML nicht zulässig ist), oder Sie verwenden möglicherweise Javascript, das die normale Formularübermittlung missbraucht und eine AJAX-Anforderung ausführt, die dies nicht tut. t funktioniert mit Datei-Uploads.
Darin Dimitrov
Ich habe Ihre Controller-Aktion und das Rasiermesser '@using' verwendet. Es wird jedoch angezeigt -> Beschreibung: HTTP 404. Die gesuchte Ressource (oder eine ihrer Abhängigkeiten) wurde möglicherweise entfernt, ihr Name wurde geändert oder ist vorübergehend nicht erreichbar. Bitte überprüfen Sie die folgende URL und stellen Sie sicher, dass sie richtig geschrieben ist.
kk-dev11
@ user1076915, wann erhalten Sie diese Fehlermeldung? Wann möchten Sie das Upload-Formular rendern oder wann senden Sie das Formular? GETStellen Sie im ersten Fall sicher, dass Sie über eine Upload-Aktion verfügen , die der Upload.cshtmlAnsicht mit diesem Code dient : public ActionResult Upload() { return View(); }. Stellen Sie also sicher, dass Sie einen Controller namens haben UploadController, der die beiden Upload-Aktionen enthält: eine zum Bereitstellen des Formulars und die andere zum Verarbeiten der Übermittlung.
Darin Dimitrov
2
Funktioniert, aber in einem POST-Kontext schlage ich vor, Folgendes hinzuzufügen: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze