2012-06-01 14 views
13

In meinem Controller habe ich, weil ich in der Lage sein wollte, einige Details über das Video ausfüllen und tatsächlich hochladen, die Video-Klasse benötigt nicht das eigentliche Video, weil es sein wird an einen anderen Webdienst übergeben.ASP MVC Datei Upload HttpPostedFileBase ist Null

public class VideoUploadModel 
    { 
     public HttpPostedFileBase vid { get; set; } 
     public Video videoModel { get; set; } 
    } 

    // 
    // POST: /Video/Create 
    [HttpPost] 
    public ActionResult Create(VideoUploadModel VM) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Videos.AddObject(VM.videoModel); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); 
     return View(VM); 
    } 

und aus meiner Sicht Ich habe

@model LifeHighlightsShoeLace.Controllers.VideoController.VideoUploadModel 
@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
@using (Html.BeginForm("Create", "Video", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Video</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.videoModel.KalturaID) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.videoModel.KalturaID) 
     @Html.ValidationMessageFor(model => model.videoModel.KalturaID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.videoModel.Size) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.videoModel.Size) 
     @Html.ValidationMessageFor(model => model.videoModel.Size) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.videoModel.Date) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.videoModel.Date) 
     @Html.ValidationMessageFor(model => model.videoModel.Date) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.videoModel.UploadedBy) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.videoModel.UploadedBy) 
     @Html.ValidationMessageFor(model => model.videoModel.UploadedBy) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.videoModel.UserId, "User") 
    </div> 

    <div class="editor-field"> 
     @Html.DropDownList("UserId", String.Empty) 
     @Html.ValidationMessageFor(model => model.videoModel.UserId) 
    </div> 
    <div class="editor-field"> 
    <input name="model.vid" type="file" /> 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 

}

Wenn ich die Form der videoModel Teil der VM einreichen ausgefüllt ist aber die eigentliche Datei vid null ist . Irgendwelche Ideen?

Antwort

19

-Update nach OP Kommentar

stellen Sie die Max Dateilänge in der Datei web.config Ändern Sie das "?" zu einer Dateigröße, die Sie Ihren max sein mögen, zum Beispiel 65536 64MB

<configuration> 
    <system.web> 
    <httpRuntime maxRequestLength="?" /> 
    </system.web> 
</configuration> 

Sie ist, kann die Datei in das Modell nicht hinzufügen, wird es in einem eigenen Feld nicht Teil des

Modells seine
<input name="videoUpload" type="file" /> 

Ihre Aktion ist falsch.Es braucht die Datei zu akzeptieren, wie es eigene Parameter sind (oder wenn mehrere Verwendung IEnumerable<HttpPostedFileBase> als Parameter Typ)

[HttpPost] 
public ActionResult Create(VideoUploadModel VM, HttpPostedFileBase videoUpload) 
{ 
    if (ModelState.IsValid) 
    { 
     if(videoUpload != null) { // save the file 
      var serverPath = server.MapPath("~/files/" + newName); 
      videoUpload.SaveAs(serverPath); 
     } 

     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); 
    return View(VM); 
} 

Wenn Sie mehrere Dateien ermöglicht wurden Sie für die

[HttpPost] 
public ActionResult Create(VideoUploadModel VM, IEnumerable<HttpPostedFileBase> videoUpload) 
{ 
    if (ModelState.IsValid) 
    { 
     if(videoUpload != null) { // save the file 
      foreach(var file in videoUpload) { 
       var serverPath = server.MapPath("~/files/" + file.Name); 
       file.SaveAs(serverPath); 
      } 
     } 

     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); 
    return View(VM); 
} 
+0

Danke (und @BuildStarted). Jetzt, wenn ich auf Create IE klicke, gibt mir ein "IE kann die Webseite nicht anzeigen" Fehler und Chrome sagt mir, dass die Verbindung zu Localhost unterbrochen wurde. Wenn ich keine Datei einfüge, wird sie ohne Probleme gepostet. –

+0

Klingt wie Sie eine Datei größer als 4 MB –

+0

Haha ja ausgewählt haben. Danke Leute! –

0

Änderung

<input name="model.vid" type="file" /> 

zu

@Html.TextBoxFor(model => model.vid, new {type="file"}) 

je nachdem, was sonst noch auf Ihrer Seite ist, und wo die Ansicht gerendert wird, wird die MVC einzigartigen IDs generieren, ich glaube, Ihr hart codiert ID ist nicht korrekt mit den Formularfeldern verknüpft.

+0

Ja ich hatte, dass vor und ich habe gerade versucht es erneut. VM.vid ist immer noch null. –

2

Der Grund ist es nicht verbindlich ist, weil das Modell Bindemittel bei QueryString, Form sieht nur, und RouteData wenn ein komplexes Modell wie bei Ihnen zu binden. Um dies zu umgehen, müssen Sie einen anderen Parameter in Ihrer Aktionsmethode haben. (Ändern Sie Ihre "name" nur "vid" auch)

[HttpPost] 
public ActionResult Create(VideoUploadModel VM, HttpPostedFileBase vid) 
{ 
    //add your vid to the model or whatever you want to do with it :) 

    if (ModelState.IsValid) 
    { 
     db.Videos.AddObject(VM.videoModel); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); 
    return View(VM); 
} 
+0

Ich freue mich, Sie hier zu sehen! :-) –

2

erlauben müssen ausgewählt werden funktioniert bei mir:

public class CreateVeiwModel 
    { 
     public Speaker Speaker { get; set; } 
     public Guid Guid { get; set; } 
     public HttpPostedFileBase File { get; set; } 
    } 

Controller:

[HttpPost] 
     public ActionResult Create(CreateVeiwModel model) 
     { 
      if (ModelState.IsValid) 
      try 
      { 
       Repository.AddSpeaker(model.Speaker); 
      ... 
     } 
Ansicht

:

@Html.Label("Most Up-to-Date CV") 
      <input type="file" name="File"/> 

Ich denke Lösung dort platziert: Model.File ~ <input name="File"/>

Verwandte Themen