我已将enctype设置为:multipart / form-data但是每当我提交此表单时,Request.ContentType为:application / x-www-form-urlencoded,并且无法从Request检索上传内容.Files。
这是我的观点:
<% using (Html.BeginForm("Import", "Content", FormMethod.Post, new { enctype = "multipart/form-data" })) { %>
<p>
<%= Html.CheckBox("DeleteExisting")%> Delete Existing Records?
</p>
<p>
<input type="file" name="FileUpload" id="FileUpload" /> Select a dump file.
</p>
<p>
<input type="submit" value="Import Now" />
</p>
<% } %>
这是我的行动:
[HttpPost]
public ActionResult Import(FormCollection fc)
{
string chkDelete = fc["DeleteExisting"];
//string filename = fc["FileUpload"];
if (!chkDelete.Equals("false"))
{
//TODO: delete existing records, if specified
}
var inputFile = Request.Files["FileUpload"];
return View();
}
在PostBack中,填写了“fc”变量,我可以访问复选框的值,并可以获取上传的文件名。
为什么我的enctype会被忽略?
我尝试手动将表单标记放在视图中,属性位于不同的位置,但没有区别。
我唯一能想到的是这个导入表单嵌套在MasterPage的表单中,但这似乎不应该是一个问题。另外,我把这个表格妥善包围了。
有什么建议吗?
答案 0 :(得分:4)
我相信这里有两个问题:
我唯一能想到的是这个导入表单嵌套在MasterPage的表单中,但这似乎不应该是一个问题。另外,我把这个表格妥善包围了。
这可能是大多数问题 - 有两件事让我担心:
我建议您从母版页中删除表单,只需在实际表单周围需要时添加它们。这可能很好地解决了你所看到的问题。
其次,您需要根据HttpPostedFileBase
为您的操作添加参数:
public ActionResult Import(FormCollection fc, HttpPostedFileWrapper FileUpload)
{
string chkDelete = fc["DeleteExisting"];
if (null != FileUpload && 0 < FileUpload.ContentLength) {
// We have an upload.
string filename = FileUpload.FileName;
if (!chkDelete.Equals("false"))
{
//TODO: delete existing records, if specified
}
// Stream file in from FileUpload.InputStream e.g.:
var bytesOriginal = new byte[FileUpload.ContentLength];
FileUpload.InputStream.Read(bytesOriginal, 0, FileUpload.ContentLength);
//Read from the byte array as you would any normal file.
}
return View();
}
我刚刚在一个简单的视图中尝试了这个(没有母版页,没有嵌套的表单),它的行为与我期望的完全一样 - 没有HttpPostedFileWrapper,FormCollection只包含复选框。