上传带有帖子的文件以及带有模型的其余表单数据

时间:2018-09-25 14:22:00

标签: c# asp.net .net

我正在尝试将用户上传到我的表单的一些文件以及该视图的模型传递回我的控制器...这是我现在的做法...

public ActionResult Index( HttpPostedFileBase file, HttpPostedFileBase file2, HttpPostedFileBase file3, FullModelView fullViewModel)
        {

}

<form action="" method="post" enctype="multipart/form-data">
        <h4>Attach receipt:</h4>
        <label for="file">Filename:</label>
        <input type="file" name="file" id="file" /><br>

        <br>
        <h4>Attach receipt log sheet:</h4>
        <label for="file2">Filename:</label>
        <input type="file" name="file2" id="file2" /><br>

        <br>
        <h4>Attach ETRA meeting minutes:</h4>
        <label for="file3">Filename:</label>
        <input type="file" name="file3" id="file3" /><br>

        <input type="submit" />
    </form>

    <div class="form-group">
        @Html.LabelFor(model => model.forms.AMOUNT_REQUESTED, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.forms.AMOUNT_REQUESTED, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.forms.AMOUNT_REQUESTED, "", new { @class = "text-danger" })
        </div>
    </div>

现在它按预期方式将模型与数据一起回传,但不会将文件回传

编辑

我的模特...

public partial class FullModelView
    {
        public TRA_FORMS forms { get; set; }


        public HttpPostedFileBase file { get; set; }
        public HttpPostedFileBase file2 { get; set; }
        public HttpPostedFileBase file3 { get; set; }

    }

我的观点...

 <h2>Attach Documents:</h2>


            <h4>Attach receipt:</h4>
            <label for="file">Filename:</label>
            <input type="file" name="file" id="file" /><br>

            <br>
            <h4>Attach receipt log sheet:</h4>
            <label for="file2">Filename:</label>
            <input type="file" name="file2" id="file2" /><br>

            <br>
            <h4>Attach ETRA meeting minutes:</h4>
            <label for="file3">Filename:</label>
            <input type="file" name="file3" id="file3" /><br>

            <input type="submit" />

2 个答案:

答案 0 :(得分:0)

这里有些错误。第一步是将HttpPostedFilebase属性移到视图模型FullModelView中,并在控制器方法输入参数中放入FullModelView

第二,将index作为表单发布是不常见的,通常保留给最初的Get以返回页面标记。将controller方法更改为有意义的内容(FullModelSubmit?),并用后期注释装饰它,以便您拥有此方法...

[HttpPost]
public ActionResult FullModelSubmit(FullModelView fullViewModel)
{

}

最后,您需要通过设置其action属性或使用@HtmlBeginForm ...来告诉表单将​​其发布到控制器的该方法。

类似

<form method="post" action="@Url.Action("FullModelSubmit", "ControllerNameGoesHere")" enctype="multipart/form-data">

@using (Html.BeginForm("FullModelSubmit", "ControllerNameGoesHere", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    //html controls here
}

您还应该考虑将anti forgery token用于以下形式-并相应地装饰post方法。

编辑:

我猜您还没有在视图中引用您的模型,这恰好在cshtml的顶部。显然可以解决任何名称空间问题。

@model FullModelView

您还应该用mvc的html助手替换html,而不是

<input type="file" name="file3" id="file3" />

您可以编写以下内容以将控件显式绑定到模型属性。

@Html.TextBoxFor(m=>m.file3, new { @type='file'} )

我也不确定为什么您的ViewModel是partial。有这个原因吗?

答案 1 :(得分:-1)

最后弄清楚了,我所缺少的是“ multipartform-data”……现在可以正常工作了

@using (Html.BeginForm("FullModelSubmit", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{