ASP.NET MVC 3: DataAnnotations.FileExtensionsAttribute not working
Since System.ComponentModel.DataAnnotations.FileExtensionsAttribute is sealed. I use a wrapper for 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);
}
}
Use the Extensions property to set them. Although according to the documentation
The file name extensions, or the default file extensions (".png", ".jpg", ".jpeg", and ".gif") if the property is not set.
You can set it just like you did the ErrorMessage
. The more likely issue is that it doesn't know how to assess whether the HttpPostedFileBase
has the right extension. You'll need to use the one from the MVC framework or create your own.