找不到HttpPostedFileBase方法

时间:2013-12-20 17:52:03

标签: .net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor

在我的视图模型中,我添加了一个HttpPostedFileBase对象作为属性。就我而言,我希望人们能够从我们局域网的任何地方选择一个文件,并能够上传电子表格进行处理。

只要没有选择文件,我写的页面现在会发回到正确的控制器方法。但是,如果我选择要发送回控制器的电子表格,我会从Chrome获取下面显示的页面。我在控制器中设置了一个断点来验证,如果我没有选择文件,它只会被命中。 enter image description here

视图模型

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");
    }

以下是“开发者工具”中“网络”标签的屏幕截图

enter image description here

第二次编辑

好的,所以我发现在我的帖子或下面发布的任何方法实际上都有效,只要我没有抓住我需要的电子表格...我抓了一个简单的文本文件并且能够发布文件回到控制器就好了。接下来我尝试了一个更大,更大的文件,直到我选择了此页面所需的电子表格(电子表格中有100k记录)。一旦我到达电子表格,我再次收到“网页不可用”消息。

使用HttpPostedFileBase时是否存在文件大小限制?如果有,是否有办法改变它,比如在web.config中?

我通常需要的电子表格大约是9/10 MB。

3 个答案:

答案 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)中没有将操作重定向到用户的索引操作。

相关问题