在我的视图模型中,我添加了一个HttpPostedFileBase
对象作为属性。就我而言,我希望人们能够从我们局域网的任何地方选择一个文件,并能够上传电子表格进行处理。
只要没有选择文件,我写的页面现在会发回到正确的控制器方法。但是,如果我选择要发送回控制器的电子表格,我会从Chrome获取下面显示的页面。我在控制器中设置了一个断点来验证,如果我没有选择文件,它只会被命中。
视图模型
namespace Monet.ViewModel
{
public class ZipCodeIndex
{
//Imported spreadsheet
[DisplayName("Import Spreadsheet")]
public HttpPostedFileBase Import { get; set; }
查看
@model Monet.ViewModel.ZipCodeIndex
@{
ViewBag.Title = "Zip Code Territory Search";
Layout = "~/Views/Shared/_Layout.cshtml";
}
using (Html.BeginForm("UploadFile", "ZipCodeTerritory", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ActionLink("Create New", "Create")
<div style="float: right; padding-left: 15px;">
@Html.TextBoxFor(model => model.Import, new { type = "file" })
<input type="submit" value="Upload Spreadsheet" />
</div>
}
控制器
[HttpPost]
public ActionResult UploadFile(ZipCodeIndex index)
{
//Set a breakpoint here that only gets hit if file isn't selected
var fp = Path.Combine(HttpContext.Server.MapPath("~/ImportUploads"), Path.GetFileName(index.Import.FileName));
return RedirectToAction("Index");
}
修改
我将表单更改为简单地将文件传递回控制器。但是,我仍然遇到完全相同的问题。如果没有选择文件,使用网站下面的代码将回发到控制器。但是,如果选择了某个文件,我会收到“网页不可用”消息(使用Chrome,IE 10和Firefox获取此消息)。
查看
using (Html.BeginForm("UploadFile", "ZipCodeTerritory", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ActionLink("Create New", "Create")
<div style="float: right; padding-left: 15px;">
<input type="file" name="FileUpload1" />
<input type="submit" value="Upload Spreadsheet" />
</div>
}
控制器
[HttpPost]
public ActionResult UploadFile(HttpPostedFileBase Import)
{
//Set a breakpoint here that only gets hit if file isn't selected
var fp = Path.Combine(HttpContext.Server.MapPath("~/ImportUploads"), Path.GetFileName(Import.FileName));
return RedirectToAction("Index");
}
以下是“开发者工具”中“网络”标签的屏幕截图
第二次编辑
好的,所以我发现在我的帖子或下面发布的任何方法实际上都有效,只要我没有抓住我需要的电子表格...我抓了一个简单的文本文件并且能够发布文件回到控制器就好了。接下来我尝试了一个更大,更大的文件,直到我选择了此页面所需的电子表格(电子表格中有100k记录)。一旦我到达电子表格,我再次收到“网页不可用”消息。
使用HttpPostedFileBase
时是否存在文件大小限制?如果有,是否有办法改变它,比如在web.config中?
我通常需要的电子表格大约是9/10 MB。
答案 0 :(得分:2)
尝试增加MaxRequestLength大小,将其添加到<system.web>
部分下的web.config。
<httpRuntime maxRequestLength="1048576" />
如果'httpRuntime'元素已存在,请添加该属性。可以阅读有关this here的更多信息。
答案 1 :(得分:0)
我不确定您是否可以在视图模型中嵌入HttpPostedFileBase
,但我相当肯定您不能使用它:
@Html.TextBoxFor(model => mode.Import, new { type = "file" })
相反,您必须使用input type="file"
并将其命名为控制器所期望的相同内容:
<input type="file" name="Import" />
如果它仍然没有绑定,我会将其从视图模型中取出并将您的POST操作更改为以下内容:
public ActionResult UploadFile(ZipCodeIndex index, HttpPostedFileBase import)
同样,我不知道你是否可以在视图模型中绑定HttpPostedFileBase
,但我知道只要你将input
元素命名为与参数相同,第二种方法就可以工作被命名。
答案 2 :(得分:0)
您的UploadFile
操作方法是否在ZipCodeTerritory
控制器(ZipCodeTerritoryController.cs
)中?如果是,这应该工作。
@using (Html.BeginForm("UploadFile", "YourControllerNameHere",
FormMethod.Post, new { enctype = "multipart/form-data" }))
{
//your code
}
您可能会收到“找不到页面”的一个原因可能是您在当前控制器(ZipCodeTerritoryController
)中没有将操作重定向到用户的索引操作。