1

这是Bind value to model in Asp.Net MVC Application的一种跟进。

我有一个具有不同控制类的模型。相关代码:

public class FileUploadModel
    {
        public HttpPostedFileBase File { get; set; }
    }

我对以下相关代码有部分看法:

@Html.TextBoxFor(x => x.File, new { type = "file", id = "File", name = "File" }) 

然后是一个主视图,其中部分视图使用以下相关代码呈现:

@using (Ajax.BeginForm("ActionMethods", "Index", new AjaxOptions { UpdateTargetId = "parameterList" }, new { enctype = "multipart/form-data" }))
{

  <div id="parameterList">
        <div id="verifyBtnDiv" style="display:none;">

             **THIS IS WHERE THE PARTIAL VIEW AS SHOWN ABOVE WOULD BE RENDERED**

            <input type="submit" id="verifyBtn" value="Verify"/>

        </div>
 </div>

}

现在,当提交发生时,文件不会绑定到模型属性。控制权传递给控制器​​,但我调试并看到它为空。对此有什么建议吗?

4

1 回答 1

2

您发布的代码存在一些问题,这些问题会阻止您尝试执行的操作。

首先,我很确定您不能使用@Html.TextBoxFor帮助程序并将其转换为文件输入。如果它现在有效,我不会依赖它,因为您正在覆盖它的意图,并且将来可能会中断。让我们输出一个文件输入,其 Id 和 Name 与您的 ViewModel 属性匹配。

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

接下来,您不能 使用Ajax.BeginForm() 来上传文件。这是 AJAX 的限制,而不是 Ajax.BeginForm 的问题。因此,我们需要使用正确的enctype将您的表单元素更新为普通的 Html.BeginForm (这很重要)

@using (Html.BeginForm("Upload", "MyControllerName", FormMethod.Post, new { enctype = "multipart/form-data"}))
{
    <div id="parameterList">
        <div id="verifyBtnDiv" style="display:none;">
            <!-- Chose to just put the one line here instead of calling a partial-->
            <input type="file" name="File" Id="File/>
            <input type="submit" id="verifyBtn" value="Verify"/>
        </div>
 </div>
}

最后,如果您必须/需要通过 AJAX 上传文件,有很多关于用于 Ajax 文件上传的库的好建议。我个人喜欢jQuery.Form插件,因为它处理文件上传的方式非常透明。

于 2013-11-12T23:49:30.250 回答