2011-12-16 13 views
8

एमएसडीएन दस्तावेज के अनुसार, डिफ़ॉल्ट रूप से FileExtensionsAttribute (.NET 4.5) मुझे केवल jpg, jpeg, gif और png फ़ाइलों को अपलोड करने की अनुमति देनी चाहिए - जो मैं चाहता हूं ।एएसपी.नेट एमवीसी 3: डेटाअनोटेशन। फ़ाइल एक्सटेंशन नहीं काम

मैंने विशेषता के बिना एक jpg अपलोड करने का प्रयास किया, यह काम करता है। महान। तब मैं मेरे विचार मॉडल के लिए विशेषता को जोड़ ..

[FileExtensions(ErrorMessage = "Please specify a valid image file (.jpg, .jpeg, .gif or .png)")] 
public HttpPostedFileBase ImageFile { get; set; } 

कोई खुशी। सत्यापन विफल रहता है और त्रुटि संदेश दिखाया गया है। इसके शीर्ष पर किसी भी अनुमत कस्टम फ़ाइल एक्सटेंशन को निर्दिष्ट करने का कोई तरीका प्रतीत नहीं होता है। मैंने FileExtensionsAttribute को विस्तारित करने और अपने स्वयं के सत्यापन तर्क का उपयोग करके समाप्त किया, जो अपेक्षा के अनुसार काम करता है। लेकिन इस तरह से काम क्यों नहीं करता?

पूरे नियंत्रक को पोस्ट करेगा और यदि आवश्यक हो तो देखेंगे। मेरे द्वारा अपलोड की तर्क के लिए एक आधार के रूप में इस उदाहरण का इस्तेमाल किया, लेकिन इसके बजाय DataAnnotations.FileExtensionsAttribute का उपयोग कर Microsoft.Web.Mvc.FileExtensions की .. How do I upload images in ASP.NET MVC?

उत्तर

5

उन्हें स्थापित करने के लिए Extensions संपत्ति का उपयोग करें। प्रलेखन

फ़ाइल नाम एक्सटेंशन, या डिफ़ॉल्ट फ़ाइल एक्सटेंशन (".png", ".jpg", ".jpeg", और ".gif") के अनुसार गुण सेट नहीं है, तो यद्यपि ।

आप इसे ErrorMessage जैसे ही सेट कर सकते हैं। अधिक संभावना मुद्दा यह है कि यह नहीं पता कि कैसे मूल्यांकन किया जाए कि HttpPostedFileBase का सही विस्तार है या नहीं। आपको एमवीसी ढांचे से एक का उपयोग करना होगा या अपना खुद का बनाना होगा।

+0

धन्यवाद: यह @jfeinour का एक संशोधित संस्करण, कि क्लाइंट साइड रूप में अच्छी तरह पर काम करेंगे है। आप FileExtensionsAttribute के बारे में सही नहीं थे, यह जानने के लिए कि फ़ाइल नाम का उपयोग कैसे करें। यह पैरामीटर को सत्यापित करने के लिए पैरामीटर की अपेक्षा करता है। –

+0

इसके अलावा, एक नोट के रूप में, मुझे एहसास हुआ कि त्रुटि संदेश एक संपत्ति है जबकि फ़ाइल एक्सटेंशन फ़िल्टर स्ट्रिंग केवल वैकल्पिक कन्स्ट्रक्टर तर्क के रूप में सेट की जा सकती है (यह केवल पढ़ने वाली संपत्ति है)। प्रत्येक के लिए वाक्यविन्यास थोड़ा अलग है। –

0

FileExtensionsAttribute एक HttpPostedFileBase सत्यापित करने के लिए कैसे पता नहीं है, तो मैं इसे बढ़ाया ..

/// <summary> 
/// A File extensions attribute for verifying the file extensions of posted files from MVC forms. 
/// </summary> 
public class PostedFileBaseFileExtensionsAttribute : FileExtensionsAttribute 
{ 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file == null) 
     { 
      return new ValidationResult("No File Specified"); 
     } 

     return base.IsValid(file.FileName, validationContext); 
    } 
} 

ध्यान दें कि यह विधि फ़ाइल बलों एक आवश्यक फ़ील्ड किया जाना है। वैकल्पिक रूप से, यदि यह एक वैकल्पिक क्षेत्र है, तो विधि निकाय के लिए नीचे दिए गए कोड का उपयोग करें। यह हमेशा सफलता देता है यदि कोई फ़ाइल निर्दिष्ट किया जाता है (शायद और अधिक ज्यादातर मामलों में सही) ..

 var file = value as HttpPostedFileBase; 
     return file == null ? ValidationResult.Success : base.IsValid(file.FileName, validationContext); 
+9

फाइल एक्सटेंशन नहीं है एट्रिब्यूट सील? – Ben

+1

FileExtensionsAttribute क्लास सील कर दिया गया है। तो यह विरासत में नहीं हो सकता – Unnie

24

के बाद से System.ComponentModel.DataAnnotations.FileExtensionsAttribute बंद है। मैं एमवीसी के लिए एक रैपर का उपयोग करता हूं 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); 
    } 
} 
+0

क्या क्लाइंट सत्यापन काम कर रहा है? – Escobar5

+0

हां इसे चाहिए, क्योंकि यह 'IClientValidatable' है, इसे HTML – jfeinour

+0

@bzlm में अनियंत्रित jquery विशेषताओं को उत्सर्जित करना चाहिए - यह एएसपी के साथ अपेक्षित काम करता है।नेट एमवीसी 5 और नया [JQuery Validation Unobtrusive Native] (http://johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/) लाइब्रेरी - यह अधिक अद्यतित JQuery Valdiation लाइब्रेरी का उपयोग करता है। –

1

मुझे पता है कि यह बहुत देर हो चुकी है, लेकिन शायद यह किसी को वहां से मदद कर सकती है।

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); 
    } 
} 
+0

मुझे हमेशा आपके समाधान पसंद हैं, लेकिन ऐसा लगता है कि यह मेरे क्लाइंट-साइड सत्यापन को तोड़ने लगता है और मैं भी त्रुटि मैसेज रिसोर्सनाम को अंदर नहीं डाल सकता। कोई भी समाधान? –

+0

जैसे ही मैं एक फ़ाइल एक्सटेंशन गुण या आपके रैपर डालता हूं, क्लाइंट-साइड सत्यापन काम नहीं करता है। –

+0

जेएफनोर का संस्करण एएसपी.नेट एमवीसी 5 और जेक्वियर वैलिडेशन अनोबट्रूसिव नेटिव के साथ अपेक्षित काम करता है] (http://johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/) लाइब्रेरी - जो अधिक अद्यतित JQuery का उपयोग करता है एमएस Unobtrusive पैकेज के साथ आने वाले बहुत पुराने लोगों की बजाय Valdiation पुस्तकालयों। –

संबंधित मुद्दे