如何从表单上传文件?

时间:2014-10-29 17:47:45

标签: asp.net-mvc-4 razor file-upload

所以我已经阅读了几本关于此问题的指南,但我仍然遇到问题。我使用的是ASP.NET MVC 4 Razor。

这是我到目前为止所拥有的:

控制器

public class FormsController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    [AllowAnonymous]
    public ActionResult TechProjectPlan(IEnumerable<HttpPostedFileBase> files, MvcApplication1.Models.TechProjectPlanModel model, string returnUrl)
    {
        //stuff here
    }
}

这个表单包含很多不同的字段,而不仅仅是文件,所以我也有这个模型。请求到达控制器和操作就好了,但&#34;文件&#34;总是&#34; Count = 0&#34;,只是空。

这里是查看内容:

@using (Html.BeginForm("SubmitForm", "Forms", new { enctype = @"multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <h3>Project Information</h3>
    <fieldset>
    <legend>Project Information</legend>
    <ol style="display:block; *display:inline; *zoom:1;">
        <li style="float:left;">
            @Html.LabelFor(m => m.Item1)
            @Html.TextBoxFor(m => m.Item1, new { @class = "CostItem" })

        </li>
        <li style="float:left;">
            @Html.LabelFor(m => m.Quantity1)
            @Html.TextBoxFor(m => m.Quantity1, new { @class = "CostQuantity" })
            <span>  $</span>
        </li>
        <li style="float:left;">
            @Html.LabelFor(m => m.PerUnitCost1)
            @Html.TextBoxFor(m => m.PerUnitCost1, new { @class = "CostPerUnitCost" })
            <span>  $</span>
        </li>
        <li style="float:left;">
            @Html.LabelFor(m => m.Extension1)
            @Html.TextBoxFor(m => m.Extension1, new { @class = "CostExtension" })
        </li>
        <li style="float:left;">
            @Html.LabelFor(m => m.Attachment1)
            <input type="file" value="Upload" name="file" id="upload1" style="padding: 5px;" />
        </li>
    </ol>
    <ol style="display:block; *display:inline; *zoom:1;">
        <li style="float:left;">
            @Html.TextBoxFor(m => m.Item2, new { @class = "CostItem" })
        </li>
        <li style="float:left;">
            @Html.TextBoxFor(m => m.Quantity2, new { @class = "CostQuantity" })
            <span>  $</span>
        </li>
        <li style="float:left;">
            @Html.TextBoxFor(m => m.PerUnitCost2, new { @class = "CostPerUnitCost" })
            <span>  $</span>
        </li>
        <li style="float:left;">
            @Html.TextBoxFor(m => m.Extension2, new { @class = "CostExtension" })
        </li>
        <li style="float:left;">
            <input type="file" value="Upload" name="files" id="upload2" style="padding: 5px;" />
        </li>
    </ol>
    </fieldset>
    <input type="submit" value="Submit"/>
}

正如您所看到的,输入类型文件都具有名称&#34; files&#34;,与控制器上的ActionResult中的参数匹配,并且我理解编译器应该隐式地匹配这些。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

尝试从&#39;文件&#39;更改文件输入控件的名称。到&#39;文件[0]&#39;

<input type="file" value="Upload" name="files[0]" id="upload1" style="padding: 5px;" />

同样对于其他输入控件,请确保它像文件[1],文件[2]等,并且操作方法中的参数名称是&#39; files&#39;即如果你的论点名称是&#39; arg&#39;然后你的文件输入控件的名称应该是arg [0],arg [1]等

还要确保表单标记包含enctype =&#34; multipart / form-data&#34;

<form action="<ActionName>"  method="post" enctype="multipart/form-data">