0

我有一个包含部分视图的主视图。局部视图模型有 1 个名为“HttpPostedFileBase 文件”的属性,以及其他属性

但是,当发布主视图时,该模型中的所有其他属性都会获得正确的值,但“HttpPostedFileBase 文件”为空。我已经将名称设置为与参数相同。甚至 Request.Files 也给我 0 个文件。

我做错了什么?

PS我的主视图实际上有2个部分视图。一个 PV 与主视图具有相同的模型。第二个就是我上面提到的。该模型包含对象列表和 HttpPostedFileBase 文件。像这样的代码:

public class MyPartialViewModel
{
    public List<MyObject> objInfos { get; set; }


    public ICollection<HttpPostedFileBase> file { get; set; }
}

在 PV 中,我循环使用 @Html.EditFor(model=>model.objInfos[i]) 将其绑定到模板。

所以在主视图发布方法中,我可以获得“objInfos”列表和所有对象的值正确。但对于“文件”来说只是 NULL。

4

2 回答 2

1

尝试添加enctype = "multipart/form-data"为助手htmlAttributes中的其中之一。@Html.BeginForm()

编辑:不进行视觉完整回发:

使用 iFrame 在 MVC3 中上传 AJAX 文件

在这个正确的时刻,我正在使用这种方法,在我们编写时实际实现它。

于 2012-11-09T01:25:36.653 回答
1

我刚刚遇到了同样的问题,并通过在 ActionResult 中放置一个额外的参数来获取文件上传参数来解决它。

    [Authorize]
    [HttpPost]
    public ActionResult MyActionResult(MyViewModel viewModel, HttpPostedFileBase myFileToUpload)
    {
        myViewModel.PartialViewModel.MyFileToUpload = myFileToUpload;
            //manually bind MyFileToUpload;
            //for some reason, because it's in the Partial View and it's of type HttpPostedFileBase, it won't post.

        return View(viewModel);
    }

仅出于上下文:

我的 PartialViewModel 包含代码:

    public HttpPostedFileBase MyFileToUpload{ get; set; }

和部分查看代码:

    <div class="editor-item">
        <div class="editor-label">
            @Html.LabelFor(model => model.MyFileToUpload)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.MyFileToUpload)
        </div>
    </div>

最后,我有一个 EditorTemplate Views/Shared/EditorTemplates/HttpPostedFileBase.cshtml:

@model HttpPostedFileBase
<input type="file" name="@ViewData.ModelMetadata.PropertyName" />

这是一种解决方法,而不是解决方案,但确实使您能够在将 HttpPostedFileBase 留在 PartialViewModel 中的同时上传文件。

于 2012-11-26T22:55:11.653 回答