사용자 지정 유효성 검사를 사용하는 FileExtension 유효성 검사는 중복되고 잘못된 data- * 속성을 생성합니다.

구루 프라 사드 J 라오

이 질문은에서 언급 한 답변에서 시도한 후에 발생합니다 my previous question. 나는 this article똑같은 방식으로 따랐 지만 기사에서 언급 하는 image files대신에 대한 유효성 검사를 수행 했습니다 doc files.

설명 : 나는이 input의 제어 type=file이미지 파일을 업로드 할 수있는 및이 중 하나에 있습니다 partialview. partialview에로드되는 clickbutton. 그리고에 validations언급 된 적용 을 위해 model명시 적으로 . 그러나 위에서 말했다 문서에 언급 된 모든 세트 업을 수행 한 후, 난에 파일을 검증 할 수없는 생각 도하여 만든 아주 비린내 이상 유효하지 않은 말한다. 아래는 내 설정이 어떻게 생겼는지 보여주는 코드이며 여기 에는 유효하지 않은 속성을 사용 하여 눈에 띄지 않는 유효성 검사를 통해 생성되는 코드 가 있는데, 이는 유효성 검사가 실패하기 때문일 수 있습니다.unobtrusiveformsubmitdata-*unobtrusive validationhtmldata-*

<input data-charset="file" data-val="true" data-val-fileextensions="" data-val-fileextensions-fileextensions="png,jpg,jpeg" id="File" multiple="multiple" name="File" type="file" value="">

부분보기 JS로드

$('.getpartial').on('click', function () {
    $('.loadPartial').empty().load('/Home/GetView',function () {
        var form = $('form#frmUploadImages');
        form.data('validator', null);
        $.validator.unobtrusive.parse(form);
        $(function () {
            jQuery.validator.unobtrusive.adapters.add('fileextensions', ['fileextensions'], function (options) {
                var params = {
                    fileextensions: options.params.fileextensions.split(',')
                };
                options.rules['fileextensions'] = params;
                if (options.message) {
                    options.messages['fileextensions'] = options.message;
                }
            });

            jQuery.validator.addMethod("fileextensions", function (value, element, param) {
                var extension = getFileExtension(value);
                var validExtension = $.inArray(extension, param.fileextensions) !== -1;
                return validExtension;
            });

            function getFileExtension(fileName) {
                var extension = (/[.]/.exec(fileName)) ? /[^.]+$/.exec(fileName) : undefined;
                if (extension != undefined) {
                    return extension[0];
                }
                return extension;
            };
        }(jQuery));
    })
})

ModelClass

public class ImageUploadModel
{
    [FileValidation("png|jpg|jpeg")]
    public HttpPostedFileBase File { get; set; }
}

전망

@model ProjectName.Models.ImageUploadModel

@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">
            Browse @Html.TextBoxFor(m => m.File, new { type = "file", multiple = "multiple", data_charset = "file" })
        </span>&nbsp;
        <span class="text-muted" id="filePlaceHolder">No files selected</span>
        @Html.ValidationMessageFor(m => m.File, 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>
}

마지막으로 내 CustomFileValidation 클래스

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FileValidationAttribute : ValidationAttribute, IClientValidatable
{
    private List<string> ValidExtensions { get; set; }

    public FileValidationAttribute(string fileExtensions)
    {
        ValidExtensions = fileExtensions.Split('|').ToList();
    }

    public override bool IsValid(object value)
    {
        HttpPostedFileBase file = value as HttpPostedFileBase;
        if (file != null)
        {
            var fileName = file.FileName;
            var isValidExtension = ValidExtensions.Any(y => fileName.EndsWith(y));
            return isValidExtension;
        }
        return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientFileExtensionValidationRule(ErrorMessage, ValidExtensions);
        yield return rule;
    }
}
public class ModelClientFileExtensionValidationRule : ModelClientValidationRule
{
    public ModelClientFileExtensionValidationRule(string errorMessage, List<string> fileExtensions)
    {
        ErrorMessage = errorMessage;
        ValidationType = "fileextensions";
        ValidationParameters.Add("fileextensions", string.Join(",", fileExtensions));
    }
}
사용자 3559349

블록 코드를 이동해야합니다.

$(function () {
  ....
}(jQuery));

$('.getpartial').on(..)함수 내부에서 이전까지

<script>
  $(function () {
    ....
  }(jQuery));

  $('.getpartial').on('click', function () { // or just $('.getpartial').click(function() {
    $('.loadPartial').empty().load('/Home/GetView',function () { // recommend .load('@Url.Action("GetView", "Home")', function() {
      var form = $('form#frmUploadImages');
      form.data('validator', null);
      $.validator.unobtrusive.parse(form);
    });
  });
</script>

현재 콘텐츠를로드하고 유효성 검사기를 다시 구문 분석 한 다음 jquery 유효성 검사에 메서드를 추가하지만 늦게까지 추가합니다 (검사기는 이미 구문 분석되었습니다).

참고 : 유효성 검사 함수를 $(function () {. 코드의 다른 곳에서 수행하는 $.validator...대신 삭제하고 간단히 사용할 수 있습니다 jQuery.validator.....

'비린내' data-val-*속성의 경우 정확히 코드가 생성하는 것입니다. 를 A 생성 ClientValidationRule이라는 fileextensions합니다 ( ValidationType = "fileextensions";코드)를 한 다음 명명 된 그것의 속성을 추가 fileextensions합니다 ( ValidationParameters.Add("fileextensions", ..)생성 코드 data-val-fileextensions-fileextensions="png,jpg,jpeg".에 관해서는 data-val-fileextensions="", 오류 메시지를 저장하기 위해 생성하지만 당신은 빈 문자열 그래서 하나를 생성하지 않았습니다.

귀하의 코드에 대한 몇 가지 변경을 제안합니다.

  1. FileTypeAttribute다른 파일 유효성 검사 속성 (예 : FileSizeAttribute최대 크기 유효성 검사)을 유연하게 추가 할 있도록 이름을로 바꿉니다 .
  2. 생성자에서 기본 오류 메시지 (예 : add private const string _DefaultErrorMessage = "Only the following file types are allowed: {0}";및 생성자의 마지막 줄에 다음을 포함)를 생성합니다.ErrorMessage = string.Format(_DefaultErrorMessage, string.Join(" or ", ValidExtensions));
  3. ValidationParameters.Add("fileextensions", ...)(말해)로 변경 하면 좀 더 의미있는 내용이 ValidationParameters.Add("validtypes", ...)생성됩니다 data-val-fileextensions-validtypes="png,jpg,jpeg"(스크립트를 다음으로 변경해야합니다....add('fileextensions', ['validtypes'], function() ....

편집하다

귀하의 코드는 작동 <input type="file" multiple="multiple" ... />하지 않습니다. 그렇게하려면 귀하의 속성이 있어야합니다 IEnumerable(코드에 약간의 변경 사항이 있습니다).

[FileType("png, jpg, jpeg")]
public IEnumerable<HttpPostedFileBase> Files { get; set; }

그런 다음 유효성 검사 속성은 컬렉션의 각 파일을 확인해야합니다.

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FileTypeAttribute : ValidationAttribute, IClientValidatable
{
    private const string _DefaultErrorMessage = "Only the following file types are allowed: {0}";
    private IEnumerable<string> _ValidTypes { get; set; }

    public FileTypeAttribute(string validTypes)
    {
        _ValidTypes = validTypes.Split(',').Select(s => s.Trim().ToLower());
        ErrorMessage = string.Format(_DefaultErrorMessage, string.Join(" or ", _ValidTypes));
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        IEnumerable<HttpPostedFileBase> files = value as IEnumerable<HttpPostedFileBase>;
        if (files != null)
        {
            foreach(HttpPostedFileBase file in files)
            {
                if (file != null && !_ValidTypes.Any(e => file.FileName.EndsWith(e)))
                {
                    return new ValidationResult(ErrorMessageString);
                }
            }
        }
        return ValidationResult.Success;
    }
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "filetype",
            ErrorMessage = ErrorMessageString
        };
        rule.ValidationParameters.Add("validtypes", string.Join(",", _ValidTypes));
        yield return rule;
    }
}

마지막으로 스크립트는 각 파일을 확인해야합니다.

$.validator.unobtrusive.adapters.add('filetype', ['validtypes'], function (options) {
    options.rules['filetype'] = { validtypes: options.params.validtypes.split(',') };
    options.messages['filetype'] = options.message;
});

$.validator.addMethod("filetype", function (value, element, param) {
    for (var i = 0; i < element.files.length; i++) {
        var extension = getFileExtension(element.files[0].name);
        if ($.inArray(extension, param.validtypes) === -1) {
            return false;
        }
    }
    return true;
});

function getFileExtension(fileName) {
    if (/[.]/.exec(fileName)) {
        return /[^.]+$/.exec(fileName)[0].toLowerCase();
    }
    return null;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관