MVC中的自定义验证不在部分视图上执行

本文关键字:视图 执行 自定义 验证 MVC | 更新日期: 2023-09-27 18:19:01

文件上传输入是强类型的下面是model class

public class UploadImageAlbum
{
    [CustomFileValidator]
    public HttpPostedFileBase Images { get; set; }
}

和我的CustomFileValidator课程如下:

[AttributeUsage(AttributeTargets.Property,AllowMultiple =true,Inherited =false)]
public class CustomFileValidator : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        const int maxContent = 1024 * 1024 * 50;//50 MB
        var sAllowedExt = new string[] { ".jpg", ".png" };
        var file = value as HttpPostedFileBase;
        //Check for null
        if (file == null)
        {
            return new ValidationResult("Please select an image to upload");
        }
        //Check for File Extension
        if (sAllowedExt.ToList().Contains(file.FileName.Substring(file.FileName.LastIndexOf('.'))))
        {
            return new ValidationResult("Please Upload a valid file of type : " + string.Join(",", sAllowedExt));
        }
        //Check for length of file
        if(file.ContentLength>maxContent)
        {
            return new ValidationResult("File is too large, maximum allowed size is :" + (maxContent / 1024) + "MB");
        }
        return ValidationResult.Success;
    }
}

和我的partialview如下:

@using (Html.BeginForm("UploadImages", "Admin", FormMethod.Post, htmlAttributes: new { id = "frmUploadImages", novalidate = "novalidate", autocomplete = "off", enctype = "multipart/form-data" }))
{
      <div class="form-group">
            <span class="btn btn-default btn-file-img">
                  Browse @Html.TextBoxFor(m => m.UIAModel.Images, new { type = "file", multiple = "multiple", data_charset = "file" })
            </span>&nbsp;
            <span class="text-muted" id="filePlaceHolder">No files selected</span>
            @Html.ValidationMessageFor(m=>m.UIAModel.Images, null, htmlAttributes: new { @class = "invalid" })
      </div>
      <div class="form-group">
         <button class="btn btn-primary addImage pull-right">
             <i class="fa fa-upload"></i> Upload
         </button>
      </div>
}

和下面是我如何在linkclick上加载partialview:

$('#page-inner').empty().load('/Admin/GetMediaUploadView', function () {
      $.validator.unobtrusive.parse($('form#frmUploadImages'));
      //Apply client validation for partialviews
})

但即使遵循所有步骤后,它也不显示任何消息,并指出要注意的是,如果我为相同的[Required]属性添加,它将工作得很好,但自定义验证我从未显示任何消息。我还需要添加什么来使CustomValidator工作?我关注了这篇文章,但仍然没有多大帮助。另外,如果有人让我知道如何更新这个model以便接受多个图像,这将是很大的帮助。

MVC中的自定义验证不在部分视图上执行

为了获得客户端验证,您的属性必须

  1. 实现IClientValidatable,它将添加关联的data-val-*属性到你的html和
  2. 必须包含脚本来为jQuery验证器添加方法。

本文是创建自定义客户端和服务器端验证属性的良好指南。

还请注意,您的当前属性相当有限,因为文件类型和大小是固定的,如果包含属性来指定文件类型和最大文件大小,那么您可以将其用作(例如)

[FileValidation(MaxSize="1024", FileType="jpg|png")]
public HttpPostedFileBase Images { get; set; }

本文提供了一个验证文件类型的属性示例,但可以调整为包含MaxSize属性。

旁注:如果你加载的是动态内容,那么你应该首先将验证器设置为null
var form = $('form#frmUploadImages');
form.data('validator', null);
$.validator.unobtrusive.parse(form);