2

我已经为数据注释尝试了很多正则表达式RegularExpression来检查文件扩展名是否是图像并且它总是返回错误例如我也尝试过FileExtension属性但它会在 jquery.validation 上创建一个错误。我正在使用 ASP.NET MVC 4 Razor

[RegularExpression(@"^.*\.(jpg|gif|jpeg|png|bmp)$", 
ErrorMessage = "Please use an image with an extension of .jpg, .png, .gif, .bmp")]
public string MyImage { get; set; }

这是我的标记

    <div class="editor-field">            
        @Html.TextBoxFor(x => x.DepartmentImage, new { type = "file" })            
        @Html.ValidationMessage("DepartmentImageError")
        @Html.ValidationMessageFor(model => model.DepartmentImage)
    </div>

有人可以告诉我如何让它工作吗?

4

2 回答 2

11

尝试修改如下代码。

@Html.ValidationMessageFor(model => model.MyImage)

我的建议

您的表格应如下所示。

@using (Html.BeginForm("Acion", "Conroller", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
{
    <input type="file" name="FileInfo" value="File to Upload" />
    @Html.ValidationMessageFor(I => I.FileInfo);
    <button type="submit" name="Upload" value="Upload" />
}

在此处输入图像描述

HttpPostedFileBaseModelBinder

*当您将HttpPostedFileBase的单个实例作为操作参数或模型中的属性时,映射文件完全由HttpPostedFileBaseModelBinder完成,在这种情况下不使用任何值提供程序。您可能会想为什么在这种情况下没有使用 value provider,这是因为源是单一且明确的,即 Request.Files 集合。*

在此处输入图像描述

模型

public class UploadFileModel
{
    [FileSize(10240)]
    [FileTypes("jpg,jpeg,png")]
    public HttpPostedFileBase FileInfo { get; set; }
}

在此处输入图像描述

文件大小属性

在此处输入图像描述

public class FileSizeAttribute : ValidationAttribute
{
    private readonly int _maxSize;

    public FileSizeAttribute(int maxSize)
    {
        _maxSize = maxSize;
    }

    public override bool IsValid(object value)
    {
        if (value == null) return true;

        return _maxSize > (value as HttpPostedFileBase).ContentLength;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format("The file size should not exceed {0}", _maxSize);
    }
}

文件类型属性

public class FileTypesAttribute: ValidationAttribute
{
    private readonly List<string> _types;

    public FileTypesAttribute(string types)
    {
        _types = types.Split(',').ToList();
    }

    public override bool IsValid(object value)
    {
        if (value == null) return true;

        var fileExt = System.IO
                            .Path
                            .GetExtension((value as
                                     HttpPostedFileBase).FileName).Substring(1);
        return _types.Contains(fileExt, StringComparer.OrdinalIgnoreCase);
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format("Invalid file type. Only the following types {0} 
                                    are supported.", String.Join(", ", _types));
    }
}

控制器动作方法

[HttpPost]
public ActionResult Upload(UploadFileModel fileModel)
{     
    if(ModelState.IsValid)
    {

    }

    return View(fileModel);
}
于 2013-08-24T06:26:04.513 回答
1

为该字段定义了一个正则表达式,MyImage但您@ValidationMessageFor对 DepartmentImage 进行了验证。

这应该是

@Html.TextBoxFor(x => x.MyImage, new { type = "file" }) @Html.ValidationMessageFor(model => model.MyImage)

于 2013-08-24T06:15:55.810 回答