이 질문은에서 언급 한 답변에서 시도한 후에 발생합니다 my previous question. 나는 this article똑같은 방식으로 따랐 지만 기사에서 언급 하는 image files
대신에 대한 유효성 검사를 수행 했습니다 doc files
.
설명 : 나는이 input
의 제어 type=file
이미지 파일을 업로드 할 수있는 및이 중 하나에 있습니다 partialview
. 는 partialview
에로드되는 click
의 button
. 그리고에 validations
언급 된 적용 을 위해 model
명시 적으로 . 그러나 위에서 말했다 문서에 언급 된 모든 세트 업을 수행 한 후, 난에 파일을 검증 할 수없는 생각 도하여 만든 아주 비린내 이상 유효하지 않은 말한다. 아래는 내 설정이 어떻게 생겼는지 보여주는 코드이며 여기 에는 유효하지 않은 속성을 사용 하여 눈에 띄지 않는 유효성 검사를 통해 생성되는 코드 가 있는데, 이는 유효성 검사가 실패하기 때문일 수 있습니다.unobtrusive
form
submit
data-*
unobtrusive validation
html
data-*
<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>
<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));
}
}
블록 코드를 이동해야합니다.
$(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=""
, 오류 메시지를 저장하기 위해 생성하지만 당신은 빈 문자열 그래서 하나를 생성하지 않았습니다.
귀하의 코드에 대한 몇 가지 변경을 제안합니다.
FileTypeAttribute
다른 파일 유효성 검사 속성 (예 : FileSizeAttribute
최대 크기 유효성 검사)을 유연하게 추가 할 수 있도록 이름을로 바꿉니다 .private const string _DefaultErrorMessage = "Only the following file types are allowed: {0}";
및 생성자의 마지막 줄에 다음을 포함)를 생성합니다.ErrorMessage = string.Format(_DefaultErrorMessage, string.Join(" or ", ValidExtensions));
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] 삭제
몇 마디 만하겠습니다