MaxLength क्लाइंट-साइड सत्यापन विशेषता उत्पन्न नहीं कर रहा है


83

मुझे ASP.NET MVC3 क्लाइंट-साइड सत्यापन के साथ एक उत्सुक समस्या है। मेरे पास निम्न वर्ग है:

public class Instrument : BaseObject
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Name is required.")]
    [MaxLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")]
    public string Name { get; set; }
}

मेरे विचार से:

<div class="editor-field">
    @Html.EditorFor(model => model.Name)
    @Html.ValidationMessageFor(model => model.Name)
</div>

और यहाँ उत्पन्न HTML मैं इस क्षेत्र के लिए पाठ बॉक्स के लिए मिलता है:

<input class="text-box single-line" data-val="true" data-val-required="Name is required." id="Name" name="Name" type="text" value="">

का कोई संकेत नहीं है MaxLengthAttribute, लेकिन बाकी सब काम करने लगता है।

किसी भी विचार क्या गलत हो रहा है?

जवाबों:


151

[StringLength]विशेषता का उपयोग करके देखें :

[Required(ErrorMessage = "Name is required.")]
[StringLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")]
public string Name { get; set; }

यह सत्यापन प्रयोजनों के लिए है। यदि आप उदाहरण के लिए सेट करना चाहते हैं तो इनपुट पर अधिकतम गति का वर्णन आप कस्टम डेटा एनोटेशन मेटाडेटा प्रदाता लिख ​​सकते हैं जैसा कि इस पोस्ट में दिखाया गया है और डिफ़ॉल्ट टेम्प्लेट को अनुकूलित करता है ।


3
आपका बहुत बहुत धन्यवाद। यदि कोई सोच रहा है, तो मैंने जाँच की कि EF कोड फर्स्ट StringLength विशेषता द्वारा लगाए गए अधिकतम लंबाई के साथ DB कॉलम बनाता है। :)
मैट जेनकिन्स

लेकिन यह उत्तर नहीं है। क्योंकि MinLength विशेषता भी काम नहीं करती है
Hryhorii

@Greg, StringLength विशेषता अधिकतम और न्यूनतम लंबाई निर्दिष्ट कर सकती है।
कालेब वीयर

क्या होगा यदि आप अधिकतम लंबाई, सिर्फ एक मिनट निर्दिष्ट नहीं करना चाहते हैं? आपने ज्यादातर कार्यात्मक हल सुझाया है, लेकिन यह इस समस्या को हल नहीं करता है कि सत्यापन विशेषता ठीक से मान्य नहीं है।
जेरेमी होलोवैकस

7
@JeremyHolovacs, यदि आप एक अधिकतम निर्दिष्ट करने के लिए नहीं करना चाहते हैं तो आप बस निर्दिष्ट int.MaxValueअधिकतम लंबाई के रूप में और फिर सेट MINLENGTH जो कुछ न्यूनतम लंबाई आप की जरूरत करने के लिए संपत्ति। तो, नहीं, यह केवल एक कार्यात्मक समाधान नहीं है। यह एक है जो अभ्यास में भी काम करता है।
डारिन दिमित्रोव

36

मैंने सिर्फ इस समस्या को हल करने के लिए jquery का एक स्निपेट इस्तेमाल किया।

$("input[data-val-length-max]").each(function (index, element) {
   var length = parseInt($(this).attr("data-val-length-max"));
   $(this).prop("maxlength", length);
});

चयनकर्ता उन सभी तत्वों को खोजता है जिनके पास डेटा-वैल-लंबाई-अधिकतम विशेषता सेट है। यह वह विशेषता है जो StringLength सत्यापन विशेषता सेट करेगी।

प्रत्येक लूप इन मैचों के माध्यम से घूमता है और इस विशेषता के लिए मूल्य को पार्स करेगा और इसे उस mxlength संपत्ति को असाइन करेगा जिसे सेट किया जाना चाहिए था।

बस इसे आप तैयार समारोह में जोड़ें और आप जाने के लिए अच्छे हैं।


यह बहुत चालाक है।
TheOptimusPrimus

4
आप .att ("data-val-length-max") के बजाय .data ("वैल-लेंथ-मैक्स") का उपयोग कर सकते हैं :) :)
hatsrumandcode

8

MaxLengthAttributeMVC 5.1 अपडेट के बाद से काम कर रहा है: नोट बदलें


14
यह अब सत्यापन के लिए काम करता है, लेकिन एमवीसी अभी भी तत्व maxlengthको लागू नहीं कर रहा है input
लादेन



4

उनके उत्तर के लिए @ निक-हैरिसन को सहारा:

$("input[data-val-length-max]").each(function (index, element) {
var length = parseInt($(this).attr("data-val-length-max"));
$(this).prop("maxlength", length);
});

मैं सोच रहा था कि वहाँ क्या parseInt () है? मैंने इसे बिना किसी समस्या के इसे सरल बनाया है ...

$("input[data-val-length-max]").each(function (index, element) {
    element.setAttribute("maxlength", element.getAttribute("data-val-length-max"))
});

मैं Nicks जवाब पर टिप्पणी की है, लेकिन अभी तक पर्याप्त प्रतिनिधि नहीं होगा।


3

मुझे भी यही समस्या थी और मैं अपने दृश्य मॉडल में IValidatableObject इंटरफ़ेस को लागू करके इसे हल करने में सक्षम था।

public class RegisterViewModel : IValidatableObject
{
    /// <summary>
    /// Error message for Minimum password
    /// </summary>
    public static string PasswordLengthErrorMessage => $"The password must be at least {PasswordMinimumLength} characters";

    /// <summary>
    /// Minimum acceptable password length
    /// </summary>
    public const int PasswordMinimumLength = 8;

    /// <summary>
    /// Gets or sets the password provided by the user.
    /// </summary>
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    /// <summary>
    /// Only need to validate the minimum length
    /// </summary>
    /// <param name="validationContext">ValidationContext, ignored</param>
    /// <returns>List of validation errors</returns>
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var errorList = new List<ValidationResult>();
        if ((Password?.Length ?? 0 ) < PasswordMinimumLength)
        {
            errorList.Add(new ValidationResult(PasswordLengthErrorMessage, new List<string>() {"Password"}));
        }
        return errorList;
    }
}

रेजर में मार्कअप तो है ...

<div class="form-group">
    @Html.LabelFor(m => m.Password)
    @Html.PasswordFor(m => m.Password, new { @class = "form-control input-lg" }
    <div class="password-helper">Must contain: 8 characters, 1 upper-case, 1 lower-case
    </div>
    @Html.ValidationMessagesFor(m => m.Password, new { @class = "text-danger" })
</div>

यह वास्तव में अच्छी तरह से काम करता है। यदि मैं इसके बजाय [StringLength] का उपयोग करने का प्रयास करता हूं, तो प्रदान किया गया HTML सही नहीं है। सत्यापन के रूप में प्रस्तुत करना चाहिए:

<span class="text-danger field-validation-invalid field-validation-error" data-valmsg-for="Password" data-valmsg-replace="true"><span id="Password-error" class="">The Password should be a minimum of 8 characters long.</span></span>

StringLengthAttribute के साथ प्रदान की गई HTML एक मान्यकरणसमारी के रूप में दिखाता है जो सही नहीं है। मजेदार बात यह है कि जब सत्यापनकर्ता विफल हो जाता है तब भी जमा अवरुद्ध हो जाता है!


2

StringLength महान काम करता है, मैं इसे इस तरह से इस्तेमाल किया:

[StringLength(25,MinimumLength=1,ErrorMessage="Sorry only 25 characters allowed for 
              ProductName")]
public string ProductName { get; set; }

याRegularExpression बिना स्ट्रिंग के उपयोग के बस :

[RegularExpression(@"^[a-zA-Z0-9'@&#.\s]{1,25}$", ErrorMessage = "Reg Says Sorry only 25 
                   characters allowed for ProductName")]    
public string ProductName { get; set; }

लेकिन मेरे लिए ऊपर के तरीकों ने प्रदर्शन दृश्य में त्रुटि दी, क्योंकि मेरे पास पहले से ही डेटाबेस में ProductName फ़ील्ड थी जिसमें 25 से अधिक वर्ण थे

तो अंत में मैं भर में आया था इस और इस पोस्ट और करने की कोशिश की इस तरह मॉडल के बिना सत्यापित करें :

 <div class="editor-field">
 @Html.TextBoxFor(model => model.ProductName, new
 {
 @class = "form-control",
 data_val = "true",
 data_val_length = "Sorry only 25 characters allowed for ProductName",
 data_val_length_max = "25",
 data_val_length_min = "1"
 })
 <span class="validation"> @Html.ValidationMessageFor(model => model.ProductName)</span>
 </div>

इसने मेरी समस्या को हल किया, आप मैन्युअल रूप से jquery का उपयोग करके या ModelState.AddModelError का उपयोग करके सत्यापन भी कर सकते हैं

आशा किसी की मदद करती है।


2

मुझे पता है कि मुझे पार्टी में बहुत देर हो चुकी है, लेकिन मुझे पता चला कि हम कैसे पंजीकरण कर सकते हैं MaxLengthAttribute

पहले हमें एक सत्यापनकर्ता की आवश्यकता है:

public class MaxLengthClientValidator : DataAnnotationsModelValidator<MaxLengthAttribute>
{
    private readonly string _errorMessage;
    private readonly int _length;


    public MaxLengthClientValidator(ModelMetadata metadata, ControllerContext context, MaxLengthAttribute attribute)
    : base(metadata, context, attribute)
    {
        _errorMessage = attribute.FormatErrorMessage(metadata.DisplayName);
        _length = attribute.Length;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = _errorMessage,
            ValidationType = "length"
        };

        rule.ValidationParameters["max"] = _length;
        yield return rule;
    }
}

कुछ खास नहीं हुआ। कंस्ट्रक्टर में हम कुछ मानों को विशेषता से बचाते हैं। में GetClientValidationRulesहम एक नियम निर्धारित किया है। फ्रेमवर्क द्वारा ValidationType = "length"मैप किया data-val-lengthजाता है। rule.ValidationParameters["max"]के लिए है data-val-length-maxविशेषता।

अब चूँकि आपके पास एक सत्यापनकर्ता है, इसलिए आपको केवल इसे पंजीकृत करना होगा global.asax:

protected void Application_Start()
{
    //...

    //Register Validator
    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MaxLengthAttribute), typeof(MaxLengthClientValidator));
}

वॉयला, यह सिर्फ काम करता है।


1

मैंने अपने html डॉक्यूमेंट (textarea, input, etc) में सभी इनपुट्स के लिए यह कोशिश की, जिनके पास डेटा-वैल-लंबाई-अधिकतम संपत्ति थी और यह सही तरीके से काम करता है।

$(document).ready(function () {
    $(":input[data-val-length-max]").each(function (index, element) {
        var length = parseInt($(this).attr("data-val-length-max"));
        $(this).prop("maxlength", length);
    });
});

0

यह MaxLength और MinLength की जगह ले सकता है

[StringLength(40, MinimumLength = 10 , ErrorMessage = "Name cannot be longer than 40 characters and less than 10")]

0
<input class="text-box single-line" data-val="true" data-val-required="Name is required." 
    id="Name1" name="Name" type="text" value="">

$('#Name1').keypress(function () {
    if (this.value.length >= 5) return false;
});

6
कृपया विवरण जोड़ें
किंग स्टोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.