wake-up-neo.net

mvc-Upload-Datei mit Modell - der zweite Parameter ist null

Ich habe ein einfaches Modell mit 1 String-Eigenschaft, das ich auf einer einfachen Ansicht rendere.

die Ansicht sieht wie folgt aus:

@using (Html.BeginForm("UploadFile", "Home", FormMethod.Post, new { encType="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.FirstName)
    <br /><br />

    <input type="file" name="fileUpload" /><br /><br />
    <input type="submit" value="submit me" name="submitme" id="submitme" />
}

Controller ist dies:

[HttpPost]
public ActionResult UploadFile(UploadFileModel model, HttpPostedFileBase file)
{
   // DO Stuff
   return View(model);
}

Wenn ich jetzt einreiche, wird das Modell zwar aufgefüllt, aber der zweite Parameter, der HttpPostedFileBase ist, ist null. Wenn Sie jedoch Request.Files ausführen, scheint dies zu zeigen, dass eine Datei in der Anforderung gepostet wird. Wie kann ich tatsächlich den zweiten Parameter zum Binden erhalten? 

18
Ahmed ilyas

Warum fügen Sie die hochgeladenen Dateien nicht wie folgt zu Ihrem Modell hinzu:

public class UploadFileModel 
{
    public UploadFileModel()
    {
        Files = new List<HttpPostedFileBase>();
    }

    public List<HttpPostedFileBase> Files { get; set; }
    public string FirstName { get; set; }
    // Rest of model details
}

Dann ändere deine Ansicht dazu:

@using (Html.BeginForm("UploadFile", "Home", FormMethod.Post, new { encType="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.FirstName)
    <br /><br />

    @Html.TextBoxFor(m => m.Files, new { type = "file", name = "Files" })<br /><br />
    <input type="submit" value="submit me" name="submitme" id="submitme" />
}

Dann werden Ihre Dateien wie folgt zurückgesandt:

public ActionResult UploadFile(UploadFileModel model)
{
    var file = model.Files[0];
    return View(model);
}
32
hutchonoid

Ändern Sie Ihren Namen file in fileUpload und enctype, es funktioniert

@using (Html.BeginForm("UploadFile", "Home", FormMethod.Post, new { enctype="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.FirstName)
    <br /><br />

    <input type="file" name="fileUpload" /><br /><br />
    <input type="submit" value="submit me" name="submitme" id="submitme" />
}

[HttpPost]
public ActionResult UploadFile(UploadFileModel model, HttpPostedFileBase fileUpload)
{
   // DO Stuff
   return View(model);
}
6
Jaimin

Für den Umgang mit einer einzelnen Dateieingabe können Sie eine HttpPostedFileBase -Eigenschaft im ViewModel definieren:

public class SomeModel() 
{ 
    public SomeModel() 
    {
    }

    public HttpPostedFileBase SomeFile { get; set; }
}

Und dann implementieren Sie es auf folgende Weise:

Aussicht:

@Model SomeModel

@using (Html.BeginForm(
    "Submit", 
    "Home", 
    FormMethod.Post, 
    new { enctype="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.SomeFile, new { type = "file" })
    <input type="submit" value="Upload" 
        name="UploadButton" id="UploadButton" />
}

Controller:

[HttpPost]
public ActionResult Submit(SomeModel model)
{
    // do something with model.SomeFile

    return View();
}

Falls Sie mit mehreren Dateien arbeiten müssen, können Sie entweder:

  • erstellen Sie mehrere Eigenschaften und implementieren Sie sie wie oben beschrieben.
  • Ändern Sie die public HttpPostedFileBase SomeFile-Eigenschaft in etwas wie public List<HttpPostedFileBase> SomeFiles und umfassen dann mehrere @Html.TextBoxFor(m => m.SomeFile, new { type = "file" })-Steuerelemente, um sie alle in dieser Liste anzuzeigen.

Falls Sie zusätzliche Informationen benötigen, lesen Sie diesen Blog-Beitrag , das ich zum Thema geschrieben habe.

3
Darkseal

Entfernen Sie alternativ (falls akzeptabel) die Validierungsanmerkung [Erforderlich] für Ihre Datei aus Ihrem Modell, und suchen Sie in der Controller-Aktion nach der Datei. Fügen Sie einen Fehler hinzu, wenn er nicht gefunden wird:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ActionWithFileUpload(ViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        if (Request.Files.Count > 0)
        {
            var postedFile = Request.Files[0];
            if (postedFile != null && postedFile.ContentLength > 0)
            {
                string imagesPath = HttpContext.Server.MapPath("~/Content/Images"); // Or file save folder, etc.
                string extension = Path.GetExtension(postedFile.FileName);
                string newFileName = $"NewFile{extension}";
                string saveToPath = Path.Combine(imagesPath, newFileName);
                postedFile.SaveAs(saveToPath);
            }
        }
        else
        {
            ModelState.AddModelError(string.Empty, "File not selected.");
        }
    }

    return RedirectToAction("Index"); // Or return view, etc.
}
0
Tim Tyler