使用MVC上传文件HttpPostedFileBase == null

时间:2014-02-22 20:04:47

标签: asp.net-mvc file-upload

我的控制器

public ActionResult Edit(int id)
{
    return this.EditDefault(id);
}

[HttpPost]
public ActionResult Edit(int id, Models.Company model)
{
    return this.EditDefault(id, model);
}

我的模特

pulbic class Company
{
    ... Many other Propeties
    public HttpPostedFileBase File { get; set; }
}

我的观点

@using (Html.BeginForm(new { enctype = "multipart/form-data" }))
{
    ... Many other Properties
    @Html.TextBoxFor(m => m.File, new
    {
        type = "file", style = "display:none" 
    })
    ... Submit
}

所以现在我的问题是,当我提交页面时,模型中的信息是正确的,但文件属性仍为空。

我找到了一些解决方案,其中人们在控制器中添加了HttpPostedFileBase作为参数(试过它也不起作用),但我想避免这种情况,因为模型和控制器是用T4生成的。那么有人知道为什么File Property总是为null吗?

对某些帮助会非常高兴:)

更新:向Matt Tabor找到解决方案。

对我来说,解决方案看起来像这样,因为我使用共享的编辑页面。 javascript部分是隐藏实际的文件上传元素并使用跨度,因为文件上传不是样式的。

//Shared Part
@{
    RouteData routeData = this.ViewContext.RouteData;
    string currentController = routeData.GetRequiredString("controller");
}

@using (Html.BeginForm("Edit", currentController, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    //Special Part
    ... Many other Properties
    //File upload which is hidden
    @Html.TextBoxFor(m => m.File, new
    {
        type = "file", style = "display:none" 
    })
    //Span which forwards the clicks to the file upload
    <span id="fake-file-name">Kein Bild</span>
    ... Submit
}

<script type="text/javascript">
    $(function () {
        //forward the click from the span to the file upload
        $("#fake-file-name").click(function () {
            $("#File").click();
        });
        //display the chosen file name to the user with the styled span
        $("#File").bind('change', function () {
            //we don't want the C:\fakepath to show
            var displayFileName = this.value.replace("C:\\fakepath\\", "");
            $("#fake-file-name").text(displayFileName);
        });
    });
</script>

2 个答案:

答案 0 :(得分:6)

您需要将表单方法指定为帖子

@using (Html.BeginForm("Edit", "CONTROLLER", null,FormMethod.Post, new { enctype =   "multipart/form-data" }))

答案 1 :(得分:3)

@Html.TextBoxFor(m => m.File, new
{
    type = "file", style = "display:none" 
})

而是有一个输入类型文件,如下所示 -

<input type="file" name="File" id="File"/>

PS:名称应与模型属性名称匹配。

<强>更新 从代码中删除 display:none ,它应该可以正常工作。