Selon la documentation MSDN, par défaut, le fichier FileExTensionsAttribute (.NET 4.5) devrait me permettre de télécharger uniquement des fichiers JPG, JPEG, GIF et PNG - ce que je veux.
J'ai essayé de télécharger un JPG sans l'attribut, cela fonctionne. Super. Puis
J'ai ajouté l'attribut à mon modèle de vue .. p> pas de joie. La vérification échoue et l'erreur est affichée. En plus de cela, il ne semble pas y avoir un moyen de spécifier des extensions de fichier personnalisées autorisées.
J'ai fini par prolonger le fichier FileExtensionsAbute et utiliser ma propre logique de vérification, qui fonctionne comme prévu. Mais pourquoi cela ne fonctionne-t-il pas? P> affichera l'ensemble du contrôleur et affichera si nécessaire. J'ai utilisé cet exemple comme base pour la logique de téléchargement, mais à l'aide des donnéesAnnotations.fileExtensionsAttribute au lieu de Microsoft.Web.mvc.fileExtensions .. Comment téléchargez-moi des images dans ASP.NET MVC? P> P>
4 Réponses :
Utilisez le Extensions propriété pour les définir. Bien que selon la documentation p>
Les extensions de nom de fichier ou les extensions de fichier par défaut (".png", ".jpg", ".jpeg" et ".gif") si la propriété n'est pas définie. P> blockQuote>
Vous pouvez le définir comme vous avez fait le
errorormageage code>. Plus il est probable que cela ne sait pas comment évaluer si le
httppostedfilebase code> a la bonne extension. Vous devrez utiliser celui de la structure MVC ou créer votre propre. P>
Merci. Vous aviez raison sur le fichier FileExtSitusSIttribute ne sachant pas comment accéder au nom de fichier. Il semble s'attendre à une chaîne comme paramètre à vérifier.
En outre, juste comme une note, j'ai réalisé que le message d'erreur est une propriété, tandis que la chaîne de filtre d'extensions de fichier ne peut être définie que comme argument de constructeur optionnel (une propriété en lecture seule). La syntaxe est légèrement différente pour chacun.
Le FileExtensionsAttribute ne sait pas comment vérifier httppostedfilebase, donc je l'ai donc étendu .. Notez que cette méthode force le fichier comme un champ obligatoire. Sinon, s'il s'agit d'un champ facultatif, utilisez le code ci-dessous pour le corps de la méthode. Cela renvoie toujours le succès si aucun fichier n'est spécifié (probablement plus correct dans la plupart des cas) .. p>
FileExTentisSIsSaTRibute n'est-il pas scellé?
La classe FileExtensionsAttribute est scellée. Donc, cela ne peut pas être hérité
Depuis System.componentModel.Dataannotations.FileExtensionsAttribute est scellé. J'utilise une enveloppe pour MVC 4.
public class HttpPostedFileExtensionsAttribute : DataTypeAttribute, IClientValidatable { private readonly FileExtensionsAttribute _innerAttribute = new FileExtensionsAttribute(); /// <summary> /// Initializes a new instance of the <see cref="HttpPostedFileExtensionsAttribute" /> class. /// </summary> public HttpPostedFileExtensionsAttribute() : base(DataType.Upload) { ErrorMessage = _innerAttribute.ErrorMessage; } /// <summary> /// Gets or sets the file name extensions. /// </summary> /// <returns> /// The file name extensions, or the default file extensions (".png", ".jpg", ".jpeg", and ".gif") if the property is not set. /// </returns> public string Extensions { get { return _innerAttribute.Extensions; } set { _innerAttribute.Extensions = value; } } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ValidationType = "extension", ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()) }; rule.ValidationParameters["extension"] = _innerAttribute.Extensions; yield return rule; } /// <summary> /// Applies formatting to an error message, based on the data field where the error occurred. /// </summary> /// <returns> /// The formatted error message. /// </returns> /// <param name="name">The name of the field that caused the validation failure.</param> public override string FormatErrorMessage(string name) { return _innerAttribute.FormatErrorMessage(name); } /// <summary> /// Checks that the specified file name extension or extensions is valid. /// </summary> /// <returns> /// true if the file name extension is valid; otherwise, false. /// </returns> /// <param name="value">A comma delimited list of valid file extensions.</param> public override bool IsValid(object value) { var file = value as HttpPostedFileBase; if (file != null) { return _innerAttribute.IsValid(file.FileName); } return _innerAttribute.IsValid(value); } }
Oui, il devrait, puisqu'il est iclientvalidatetable code> il doit émettre les attributs jQuery sans obstruction dans le HTML
@bzlm - Cela fonctionne comme prévu avec ASP.NET MVC5 et le plus récent Validation JQuery Discret Bibliothèque - Cela utilise les bibliothèques plus à jour de Valdiation JQuery.
Essayer d'utiliser un message d'erreur localisé avec cet emballage, mais même lorsque ErormSageresourcetype et ErormSageresourcename est défini sur httppostedfileExtensionsAttribute, il utilise toujours le message d'erreur par défaut. Des idées Comment localiser le message d'erreur?
Merci pour cela, cela fonctionne bien, mais j'ai eu un problème avec la validation du client. J'ai trouvé que la méthode extension code> trouvée dans jQuery.validation supplémentaire-méthodes.js inclut déjà le "." Avant l'extension, la validation du client doit donc transmettre les extensions sans le ".". Je l'ai adressée en modifiant la ligne
règle.validationparameters ["extension"] = _innerattribute.extensions; code> à
règle.validationParameters ["extension"] = _innerattribute.extensions.replace ("." , ""); code>
Je sais que c'est un peu trop tard, mais peut-être que cela peut aider quelqu'un là-bas. Il s'agit d'une version modifiée de @jfeinour, qui fonctionnera sur le côté client public class HttpPostedFileExtensionAttribute : ValidationAttribute, IClientValidatable {
private readonly FileExtensionsAttribute _fileExtensionsAttribute = new FileExtensionsAttribute();
public HttpPostedFileExtensionAttribute() {
ErrorMessage = _fileExtensionsAttribute.ErrorMessage;
}
public string Extensions {
get { return _fileExtensionsAttribute.Extensions; }
set { _fileExtensionsAttribute.Extensions = value; }
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
var rule = new ModelClientValidationRule {
ValidationType = "extension",
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters["extension"] =
_fileExtensionsAttribute.Extensions
.Replace(" ", string.Empty).Replace(".", string.Empty)
.ToLowerInvariant();
yield return rule;
}
public override string FormatErrorMessage(string name) {
return _fileExtensionsAttribute.FormatErrorMessage(name);
}
public override bool IsValid(object value) {
var file = value as HttpPostedFileBase;
return _fileExtensionsAttribute.IsValid(file != null ? file.FileName : value);
}
}
J'ai toujours aimé vos solutions, mais cela semble briser ma validation côté client et je ne peux pas non plus mettre d'erreur à l'intérieur. Toute solution?
Dès que je mettais un attribut FileExtensions ou votre wrapper, la validation côté client ne fonctionne pas.
La version de Jfeinour fonctionne comme prévu avec ASP.NET MVC5 et la validation de JQuery Native non obstrive] ( Johnyreilly .github.nio / jquery.validation.nobrdisive .nalative ) Bibliothèque - qui utilise les bibliothèques plus récentes de la Valdiation JQuery plutôt que les très anciennes qui viennent avec le package non obstrué de la SP.
Cela ne fonctionne pas pour moi sur le côté client parce que $ .validator.methods.extension est indéfini