C# MVC 3文件上载验证错误触发

C# MVC 3文件上载验证错误触发,c#,asp.net-mvc-3,post,file-upload,httppostedfilebase,C#,Asp.net Mvc 3,Post,File Upload,Httppostedfilebase,我的MVC 3 web应用程序中有一个文件上载功能,我正在尝试使用以下属性验证文件大小和文件类型: [FileSize(1048576, ErrorMessage = "The image is too big. It should be up to 1MB")] [FileType(MimeTypes.Image.Jpg, MimeTypes.Image.Jpeg, MimeTypes.Image.Png, "image/pjpeg", "image/x-png", ErrorMessage

我的MVC 3 web应用程序中有一个文件上载功能,我正在尝试使用以下属性验证文件大小和文件类型:

[FileSize(1048576, ErrorMessage = "The image is too big. It should be up to 1MB")]
[FileType(MimeTypes.Image.Jpg, MimeTypes.Image.Jpeg, MimeTypes.Image.Png, "image/pjpeg", "image/x-png", ErrorMessage = "Your image must be a JPG/JPEG or PNG up to 1MB.")]
public HttpPostedFileBase File { get; set; }
HTML格式如下:

<input type="file" size="20" name="File" />
@Html.ValidationMessageFor(x => x.File)

当文件被选中时,一切都很完美。但如果没有选择任何文件,我仍然会触发文件大小或文件类型验证,并出现验证错误。由于我不希望POST中需要文件,如何避免这种情况?

您必须修改文件大小和文件类型自定义验证属性,以便在值为null时不执行任何验证。例如:

public class FileSizeAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null)
        {
            // don't validate if value is null
            return null;
        }

        // TODO: do whatever validation you were supposed to do
        ...
    }
}

您可以通过[Required]属性使文件成为必需的。

您必须修改文件大小和文件类型自定义验证属性,以便在值为null时不执行任何验证。例如:

public class FileSizeAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null)
        {
            // don't validate if value is null
            return null;
        }

        // TODO: do whatever validation you were supposed to do
        ...
    }
}

通过[Required]属性,您可以使文件成为必需的。

如果值不为null,我是否可以执行默认的FileSizeAttribute验证,而不复制粘贴原始实现?我不理解您的问题。如果我像您提到的那样从FileSizeAttribute重写IsValid方法,如果值不为null,我必须手动编写其余的验证代码,即示例中的TODO部分。我有没有办法让它做与FileSizeAttribute完全相同的事情?我的意思是,当值为null时,我需要相同的功能+忽略。当然,可以调用base方法:return base.IsValidvalue,validationContext;。如果值不为null,是否有任何方法可以执行默认FileSizeAttribute验证,而无需从原始实现复制粘贴它?我不理解您的问题。如果我像您提到的那样从FileSizeAttribute重写IsValid方法,如果值不为null,我必须手动编写其余的验证代码,您的示例中的待办事项部分。我有没有办法让它做与FileSizeAttribute完全相同的事情?我的意思是,当值为null时,我需要相同的功能+忽略。当然,可以调用base方法:return base.IsValidvalue,validationContext;。