繁体   English   中英

如何使用 DataAnnotations 使用多个文件扩展名?

[英]How to use multiple file extensions using DataAnnotations?

例如,以下代码工作正常:

[Required(ErrorMessage = "Choose an image"), 
FileExtensions(Extensions = "jpg", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }

但我需要更多的扩展。 我尝试只添加几种格式,但它不起作用:

"jpg, gif, png""*.jpg, *.gif, *.png" "jpg, gif, png""*.jpg, *.gif, *.png" "GIF|*.gif|JPG|*.jpg;*.jpeg|PNG|*.png"等。 是否可以使用更多文件扩展名?

扩展名需要用逗号分隔并且没有空格(空格将被视为扩展名的一部分),所以这应该有效:

[Required(ErrorMessage = "Choose an image"), 
FileExtensions(Extensions = "jpg,gif,png", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }

以这种方式使用它:

[Required(ErrorMessage = "Choose an image"), 
FileExtensions(Extensions = "jpg,jpeg,gif,png", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }

这仅适用于一个文件扩展名,它适用于“HttpPostedFileBase”和“字符串”属性类型,并且仅适用于服务器端(因此它会在文件上传后告诉结果!):

FileExtensions(Extensions = "jpg", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }

所以如果你做这样的事情,它永远不会工作:

FileExtensions(Extensions = "jpg,gif,png", ErrorMessage = "Error")]
FileExtensions(Extensions = "jpg|gif|png", ErrorMessage = "Error")]
FileExtensions(Extensions = "jpg gif png", ErrorMessage = "Error")]
etc...

使用 DataAnnotations 使用多个文件扩展名的真正方法是创建一个简单的自定义验证属性!

第 1 步:在任何地方创建一个文件夹,任意命名,创建一个类名,哈哈

YOUR_SOLUTION_NAME\Models\CustomValidation\ValidImageFileAttribute.cs

第 2 步:使它看起来像这样,您可以将 isValid 方法中的代码更改为您需要的任何内容

    using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Web;

namespace YOUR_SOLUTION_NAME.Models.CustomValidation
{
    public class ValidImageFileAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;

            string[] _validExtensions = { "JPG", "JPEG", "BMP", "GIF", "PNG" };

            var file = (HttpPostedFileBase)value;
            var ext = Path.GetExtension(file.FileName).ToUpper().Replace(".", "");
            return _validExtensions.Contains(ext) && file.ContentType.Contains("image");
        }
    }
}

第 3 步:在模型中使用自定义验证

namespace YOUR_SOLUTION_NAME.Models
{
    public class testModel
    {

        [Required(ErrorMessage = "Please attached the personal photo")]
        [ValidImageFile(ErrorMessage = "The file is not a valid image file")]
        public HttpPostedFileBase File { get; set; }

    }
}

第 4 步:在视图中使用模型

@model FacilityMvcApp.Models.testModel

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.TextBoxFor(Model => Model.File, new { type = "file" })
            @Html.ValidationMessageFor(model => model.File  ,null, new { @class = "text-danger" })
        </div>
    </div>
}

第 5 步:观看本教程以了解有关自定义验证的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM