MVC Filename属性映射到<input />标记,因此Filename属性=选择的文件名

时间:2015-04-11 14:07:16

标签: c# asp.net-mvc

MVC5 EF6 C#

我有一个Image类的Create视图。 Image类包含字符串Property“ImagePathLocal”。

我在视图上有以下内容,让用户选择要上传的文件:

<div class="form-group">
        @Html.Label("Select Image", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">                
            <input type="file" name="photo" id="photo" class="btn btn-default" />
            @Html.ValidationMessageFor(model => model.ImagePathLocal, "", new { @class = "text-danger" })
        </div>
    </div>

我必须使用

<input type="file" name="photo" id="photo" class="btn btn-default" />

因为没有等效的@ Html.InputFor(model =&gt; model.ImagePathLocal ......等等) - 我的谷歌搜索让我相信我必须这样做(纠正我,如果我'我错了)

单击“提交”时,ModelState无效,因为未填充ImagePathLocal。文件已成功发送,我可以保存到服务器(如果我跳过验证)。

所以问题是,我如何允许用户选择一个文件,然后使用他们选择的文件的名称填充ImagePathLocal属性,以便在提交表单时填充Model.ImagePathLocal,因此ModelState有效吗?

编辑: 感谢@Ehsan,主要答案是我需要使用:

@Html.TextBoxFor(m => m.ImagePathLocal, new { type="file", @class="btn btn-default"})

但是,我想在用户选择文件后填充2个属性。我的字符串属性,即文件名,以及我的HttpPostedFileBase属性,它是用户选择的文件。我更改了表单,以便用户选择HttpPostedFileBase属性:

@Html.TextBoxFor(m => m.Image, new { type="file", @class="btn btn-default"})

我挂了那个属性,这样无论何时设置它,它都会自动设置字符串属性:

private HttpPostedFileBase _image;
    public HttpPostedFileBase Image
    {
        get
        {
            return _image;
        }
        set 
        {
            _image = value;
            ImagePathLocal = _image.FileName;
        }
    }

这完全符合我的要求。

1 个答案:

答案 0 :(得分:1)

您必须使用以htmlAttributes作为参数的TextBoxFor()重载:

@Html.TextBoxFor(m => m.ImagePathLocal, new { type="file", @class="btn btn-default"})

您也可以使用input,但它的名称应该是您的模型属性名称ImageLocalPath,如下所示:

<input type="file" name="ImageLocalPath" id="ImageLocalPath" class="btn btn-default" />