ASP MVC FIle Upload HttpPostedFileBase is Null

本文关键字:is Null HttpPostedFileBase Upload MVC FIle ASP | 更新日期: 2023-09-27 18:35:59

在我的控制器中,因为我希望能够填写有关视频的一些详细信息并实际上传它,因此 Video 类不需要实际的视频,因为它将被传递给另一个 Web 服务。

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的视频模型部分,但实际文件为空。有什么想法吗?

ASP MVC FIle Upload HttpPostedFileBase is Null

根据 OP 注释进行更新

在 web.config 文件中设置最大文件长度将"?"更改为您希望成为最大值的文件大小,例如 65536 是 64MB

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

它不绑定的原因是,模型绑定器在绑定复杂模型(如您的模型)时只查看QueryStringFormRouteData。解决此问题的方法是在操作方法中使用另一个参数。(将您的"名称"也更改为"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);
}

对我有用:

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"/>

更改

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

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

根据页面上的其他内容以及呈现视图的位置,MVC 将生成唯一的 ID,我认为您的硬编码 ID 未与表单字段正确关联。