ValidationAttribute
クライアントとサーバーの両方の検証を必要とするカスタムの実装に問題があります。サーバー上で厳密に実行すると、期待どおりに検証に合格または失敗しますが、エラー メッセージはクライアントに返されません。すべてがクライアント上で正常に動作します。
属性
public class MaxFileSizeAttribute : ValidationAttribute, IClientValidatable
{
private int _maxFileSize;
public MaxFileSizeAttribute(int maxFileSize)
{
_maxFileSize = maxFileSize;
}
public override bool IsValid(object value)
{
HttpPostedFileBase file = value as HttpPostedFileBase;
if (file == null)
{
return false;
}
return file.ContentLength <= _maxFileSize;
}
public override string FormatErrorMessage(string name)
{
return base.FormatErrorMessage(_maxFileSize.ToString());
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(_maxFileSize.ToString()),
ValidationType = "filesize"
};
rule.ValidationParameters["maxsize"] = _maxFileSize;
yield return rule;
}
}
ビューには次が含まれます。
@Html.ValidationMessageFor(model => model.File)
@Html.TextBoxFor(model => model.File, new { type="file", style="width:79%", placeholder="Select CSV or TXT file for upload"})
そしてViewModelの関連部分
[MaxFileSize(10 * 1024 * 1024, ErrorMessage="File size must be less than 10mb")]
public HttpPostedFileBase File { get; set; }