मैं विशेषता है कि मैं ViewModel में सेट करता है, तो संभव इस पर नियंत्रण करना चाहते हैं।
एएसपी.नेट एमवीसी बिल्कुल ऐसा करने के लिए एक विस्तारणीय प्रणाली प्रदान करता है। यहां आपको यह करने की आवश्यकता है:
- कस्टम
ModelMetadataProvider
लागू करें।
StringLengthAttribute
या MaxLengthAttribute
के लिए देखो, जानकारी निकालें और इसे ModelMetadata
पर जोड़ें।
- एक कस्टम संपादक टेम्पलेट प्रदान करें जो जानकारी का उपयोग करता है।
चरण 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 कि विस्तार यह कैसे काम करता है (ये उस्तरा दृश्य इंजन से पहले लिखा गया था तो दृश्य सिंटेक्स के कुछ थोड़ा अजीब है लेकिन अन्यथा जानकारी के बारे में अधिक जानना चाहते हैं आवाज है)।
क्या आपने सत्यापित किया है कि यदि आप 6 वर्णों से अधिक स्ट्रिंग पोस्ट कर सकते हैं? –
मुझे एक सत्यापन त्रुटि मिलती है, लेकिन मैं इसे वास्तव में अधिकतम लम्बाई विशेषता सेट करना चाहता हूं। –
यदि आप इसे 'टेक्स्टबॉक्स' में बदलते हैं तो आप HTML विकल्पों में जा सकते हैं। –