2012-06-01 53 views
13

En mi controlador tengo, porque quería poder completar algunos detalles sobre el video y subirlo, la clase Video no necesita el video porque va a ser pasó a otro servicio web.ASP MVC FILE Upload HttpPostedFileBase es 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); 
    } 

y en mi opinión que tengo

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

}

Cuando envíe el formulario de la parte videoModel de VM es llenada pero VID el archivo real es nulo . Alguna idea?

Respuesta

19

actualización de acuerdo con OP comentario

establecer la duración del archivo de Max en el archivo web.config Cambiar el "?" a un tamaño de archivo que desea ser su máximo, por ejemplo 65536 es de 64 MB

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

No se puede agregar el archivo en el modelo, será en su propio campo no forma parte del modelo

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

Su acción es incorrecta.Tiene que aceptar el archivo, ya que es propio parámetro (o si el uso múltiple IEnumerable<HttpPostedFileBase> como el tipo de parámetro)

[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); 
} 

Si estaban permitiendo que múltiples archivos a ser seleccionado que tiene que permitir que

[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

Gracias (y @BuildStarted). Ahora cuando hago clic en crear, IE me da un error de "IE no puede mostrar la página web" y Chrome me dice que la conexión a localhost fue interrumpida. Si no incluyo un archivo, lo publicas sin problema. –

+0

Parece que seleccionó un archivo de más de 4mb –

+0

Jaja sí. ¡Gracias chicos! –

0

cambio

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

a

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

dependiendo de lo demás está en su página, y donde se está representando la vista, la MVC generará de identificación únicos, creo que su código de identificación duro no está correctamente asociado con los campos de formulario.

+0

Sí me tenían que antes y yo sólo lo intentó de nuevo. VM.vid todavía es nulo. –

2

La razón por la que no es vinculante es porque la carpeta de modelo solo se ve en QueryString, Form y RouteData cuando se vincula un modelo complejo como el suyo. La forma de evitar esto es tener otro parámetro en su método de acción. (Cambiar su "nombre" a simplemente "vid", así)

[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

¡Me encanta verte aquí! :-) –

2

que funciona para mí:

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

controlador:

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

Vista:

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

creo solución colocado allí: Model.File ~ <input name="File"/>

Cuestiones relacionadas