2013-02-06 13 views
7

यहाँ मेरी ViewModel में संपत्ति पर maxlength स्थापित करने नहींStringLength पाठ बॉक्स

@Html.EditorFor(model => model.Extension) 

और यह renders:

<input class="text-box single-line" data-val="true" data-val-length="The field Ext. must be a string with a maximum length of 6." data-val-length-max="6" id="Extension" name="Extension" type="text" value="" /> 

चाहिए इस मेरे टेक्स्टबॉक्स पर अधिकतम लम्बाई विशेषता सेट कर रहे हैं? यदि नहीं, तो मैं DataAttributes के साथ ऐसा कैसे कर सकता हूं?

+0

क्या आपने सत्यापित किया है कि यदि आप 6 वर्णों से अधिक स्ट्रिंग पोस्ट कर सकते हैं? –

+0

मुझे एक सत्यापन त्रुटि मिलती है, लेकिन मैं इसे वास्तव में अधिकतम लम्बाई विशेषता सेट करना चाहता हूं। –

+0

यदि आप इसे 'टेक्स्टबॉक्स' में बदलते हैं तो आप HTML विकल्पों में जा सकते हैं। –

उत्तर

4

मैं विशेषता है कि मैं ViewModel में सेट करता है, तो संभव इस पर नियंत्रण करना चाहते हैं।

एएसपी.नेट एमवीसी बिल्कुल ऐसा करने के लिए एक विस्तारणीय प्रणाली प्रदान करता है। यहां आपको यह करने की आवश्यकता है:

  1. कस्टम ModelMetadataProvider लागू करें।
  2. StringLengthAttribute या MaxLengthAttribute के लिए देखो, जानकारी निकालें और इसे ModelMetadata पर जोड़ें।
  3. एक कस्टम संपादक टेम्पलेट प्रदान करें जो जानकारी का उपयोग करता है।

चरण 1: एक कस्टम ModelMetadataProvider को लागू करें।

ModelMetadataProvider से प्राप्त कक्षा बनाएं। आम तौर पर आप DataAnnotationsModelMetadataProvider से प्राप्त करेंगे क्योंकि यह कुछ डिफ़ॉल्ट कार्यक्षमता प्रदान करता है जिसका अर्थ है कि आपको केवल CreateMetadata नामक एक विधि को ओवरराइड करना होगा।

चरण 2: जानकारी निकालें:

जानकारी पाने के लिए आपको, विशेषता के लिए देखने के लिए अधिकतम लंबाई जानकारी निकालने और ModelMetadata की AdditionalValues शब्दकोश में जोड़ने की जरूरत है। कार्यान्वयन (इस पूरे कार्यान्वयन है) कुछ इस तरह दिखेगा:

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(
     IEnumerable<Attribute> attributes, 
     Type containerType, 
     Func<object> modelAccessor, 
     Type modelType, 
     string propertyName) 
    { 
     // Call the base class implementation to create the default metadata... 
     var metadata = base.CreateMetadata(
      attributes, 
      containerType, 
      modelAccessor, 
      modelType, 
      propertyName); 

     // Extract the stringLengthAttribute (you can do the same for the 
     // MaxLengthAttribute if you want). 
     var attr = attributes 
      .OfType<StringLengthAttribute>() 
      .First(); 

     // This could be getting called on a property that doesn't have the 
     // attribute so make sure you check for null! 
     if (attr != null) 
     { 
      metadata.AdditionalValues["maxLength"] = attr.MaximumLength; 
     } 

     return metadata; 
    } 
} 

आदेश में ASP.NET MVC यह आप Global.asax में Application_Start विधि में यह रजिस्टर करने की आवश्यकता का उपयोग करने के लिए।

ModelMetadataProviders.Current = new CustomModelMetadataProvider(); 

चरण 3: एक कस्टम संपादक टेम्पलेट बनाएँ।

अब आपको एक ऐसा दृश्य बनाने की आवश्यकता है जो जानकारी का उपयोग करे। Views\Shared\ फ़ोल्डर में String नामक एक नया दृश्य बनाएं।

String.cshtml

@{ 
    object maxLength; 
    if (!ViewData.ModelMetadata.AdditionalValues 
      .TryGetValue("maxLength", out maxLength)) 
    { 
     maxLength = 0; 
    } 

    var attributes = new RouteValueDictionary 
    { 
     {"class", "text-box single-line"}, 
     { "maxlength", (int)maxLength }, 
    }; 
} 

@Html.TextBox("", ViewContext.ViewData.TemplateInfo.FormattedModelValue, attributes) 

जब आप अपने आवेदन आप @Html.EditorFor फोन करके निम्न HTML उत्पादन मिल जाएगा चलाते हैं।

<input class="text-box single-line" id="Extension" maxlength="6" name="Extension" type="text" value="" /> 

आप मॉडल मेटाडाटा प्रदाता प्रणाली, Brad Wilson has a series of blog posts कि विस्तार यह कैसे काम करता है (ये उस्तरा दृश्य इंजन से पहले लिखा गया था तो दृश्य सिंटेक्स के कुछ थोड़ा अजीब है लेकिन अन्यथा जानकारी के बारे में अधिक जानना चाहते हैं आवाज है)।

+0

बेंजामिन, आप आज एक मशीन हैं! –

+0

कोई समस्या नहीं, खुशी है कि मैं मदद कर सकता हूं। –

2

मैं ऐसी ही कुछ में भाग, यहाँ था मेरे त्वरित और गंदी समाधान:

@{ 
var max = ((System.ComponentModel.DataAnnotations.StringLengthAttribute)(typeof(MyType)) 
.GetProperty("MyProp") 
.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.StringLengthAttribute), true)[0]).MaximumLength;  
} 
कि अपने html की जगह EditorFor साथ में नीचे

:

अपने .cshtml फ़ाइल के शीर्ष पर पंक्ति जोड़ें : मैं संभवत: यह स्क्रिप्ट में क्या चाहते हैं

@Html.TextBoxFor(model => model.Extension, htmlAttributes: new {maxlength=max }) 

मैं अंत में फैसला:

<script> 
    $(function() 
    { 
     var max = $("#myinput").attr("data-val-length-max"); 
     $("#myinput").attr("maxlength", max); 
    }); 
</script> 

लेकिन यदि आप स्क्रिप्ट जोड़ना नहीं चाहते हैं तो पहला उदाहरण काम करना चाहिए।

+0

यह कोड काम करता है, लेकिन हो सकता है कि आप अपने रेजर व्यू क्लीनर को एक सहायक जैसे कुछ का उपयोग कर रखना चाहें। इसके उदाहरण के लिए मेरा जवाब देखें। – djule5

4

अनिवार्य रूप से ब्राड के उत्तर के आधार पर, लैम्ब्डा सिंटैक्स का उपयोग करें ताकि आप प्रतिबिंब सामान के साथ अपने उस्तरा विचारों को प्रदूषित नहीं है एचटीएमएल सहायक पर एक विस्तार में लिपटे:

using System; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Reflection; 
using System.Web.Mvc; 

public static class HtmlHelper 
{ 
    public static int? MaxLength<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression) 
    { 
     MemberExpression memberExpression = (MemberExpression)expression.Body; 

     PropertyInfo property = typeof(TModel) 
      .GetProperty(memberExpression.Member.Name); 

     StringLengthAttribute attribute = (StringLengthAttribute)property 
      .GetCustomAttributes(typeof(StringLengthAttribute), true) 
      .FirstOrDefault(); 

     if (attribute != null) 
     { 
      return attribute.MaximumLength; 
     } 

     return null; 
    } 
} 

ऐसी है जैसे कि यह प्रयोग करें:

@Html.TextBoxFor(x => x.Name, new { maxlength = Html.MaxLength(x => x.Name) }) 

जहां x आपके मॉडल को संदर्भित करता है।

यदि StringLengthAttribute संपत्ति के लिए घोषित नहीं किया गया है, null वापस कर दिया जाएगा और maxlength विशेषता टेक्स्टबॉक्स तत्व पर खाली होगी।

अपने रेज़र पेज में उपयोग करना शामिल करना याद रखें ताकि आप विधि तक पहुंच सकें।

@using HtmlHelper 

आपको संकलन त्रुटि को दूर करने के तरीके के लिए किसी भी शून्य-सक्षम परिणाम का उपयोग करने की आवश्यकता नहीं है।

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