Вопрос по asp.net-mvc, c# – ASP MVC Загрузка файла HttpPostedFileBase имеет значение Null

13

В моем контроллере у меня есть, потому что я хотел иметь возможность заполнить некоторые детали о видео и фактически загрузить его, класс 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>

}

Когда я отправляю форму, часть videoModel VM заполняется, но vid фактический файл является нулевым. Есть идеи?

Ваш Ответ

4   ответа
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);
}
Хочешь увидеть тебя здесь! : -) CD Smith
19

установить максимальную длину файла в файле 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);
}
Звучит так, как будто вы выбрали файл размером более 4 Мб CD Smith
Спасибо (и @BuildStarted). Теперь, когда я нажимаю «Создать», IE выдает ошибку «IE не может отобразить веб-страницу», а Chrome сообщает, что соединение с localhost было прервано. Если я не включаю файл, он публикует без проблем. Matthew Arkin
Ха-ха, да. Спасибо, парни Matthew Arkin
Обновил ответ, проверь CD Smith
Спасибо, я думаю, для больших загрузок файлов лучше использовать какой-нибудь загрузчик файлов ajax / flash / silverlight? Matthew Arkin
2

Работает для меня

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

Посмотреть

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

Я думаю, что решение находится там:Model.File ~ <input name="File"/>

0

менят

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

К

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

в зависимости от того, что еще находится на вашей странице, и там, где отображается представление, MVC будет генерировать уникальные идентификаторы, я думаю, что ваш жестко запрограммированный идентификатор неправильно связан с полями формы.

Да, у меня было это раньше, и я просто попробовал это снова. VM.vid все еще нулевой. Matthew Arkin

Похожие вопросы