ASP MVC Загрузка залива HttpPostedFileBase Null
В моем контроллере у меня есть, потому что я хотел иметь возможность заполнить некоторые подробности о видео и загрузить его, класс Video не нуждается в фактическом видео, потому что он будет передан другому веб-сервису.
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);
}
и, на мой взгляд, у меня
@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>
}
Когда я отправляю форму, часть видеоМодель VM заполняется, но vid фактический файл имеет значение null.
Любые идеи?
Ответы
Ответ 1
Обновление согласно комментарию OP
установить максимальную длину файла в файле web.config
Изменить "?" к размеру файла, который вы хотите быть максимальным, например 65536 - 64 МБ
<configuration>
<system.web>
<httpRuntime maxRequestLength="?" />
</system.web>
</configuration>
Вы не можете добавить файл в модель, он будет в нем собственное поле, а не часть модели
<input name="videoUpload" type="file" />
Ваше действие неверно. Он должен принимать файл как собственный параметр (или если в качестве типа параметра используется несколько IEnumerable<HttpPostedFileBase>
)
[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);
}
Если вы разрешаете выбирать несколько файлов, вы должны разрешить это
[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);
}
Ответ 2
Причина, по которой это не является обязательным, заключается в том, что при связывании сложной модели, такой как ваш, модельное связующее только смотрит на QueryString
, Form
и RouteData
. Способ обойти это состоит в том, чтобы иметь другой параметр в вашем методе действий. (измените свое "имя" на просто "vid" )
[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);
}
Ответ 3
Работает для меня:
public class CreateVeiwModel
{
public Speaker Speaker { get; set; }
public Guid Guid { get; set; }
public HttpPostedFileBase File { get; set; }
}
Контроллер:
[HttpPost]
public ActionResult Create(CreateVeiwModel model)
{
if (ModelState.IsValid)
try
{
Repository.AddSpeaker(model.Speaker);
...
}
Вид:
@Html.Label("Most Up-to-Date CV")
<input type="file" name="File"/>
Я думаю, что решение помещено туда: Model.File
~ <input name="File"/>
Ответ 4
изменить
<input name="model.vid" type="file" />
к
@Html.TextBoxFor(model => model.vid, new {type="file"})
в зависимости от того, что еще находится на вашей странице, и где визуализируется представление, MVC будет генерировать уникальные идентификаторы, я думаю, что ваш жестко закодированный идентификатор неправильно связан с полями формы.