कुल मिलाकर डिजाइन
साथ, मेरा मानना है कि आप अगर उपयोगकर्ता चेतावनी की अनदेखी करने के लिए चुन किसी भी तरह ट्रैक करने के लिए होता है शुरू करने के लिए। ऐसा करने के लिए एक सरल और पारदर्शी तरीका है चेतावनी अनदेखा करें चेक-बॉक्स, जिसे उपयोगकर्ता सबमिट करने से पहले जांचना होगा। एक और विकल्प यह है कि उन्होंने फॉर्म को दो बार सबमिट किया है और दूसरी सबमिट पर चेतावनियों को नजरअंदाज कर दिया है; तो आपको शायद IgnoreWarnings छिपे हुए फ़ील्ड की आवश्यकता होगी। अन्य डिज़ाइन हो सकते हैं, लेकिन सादगी के लिए मैं पहले विकल्प के साथ जाऊंगा।
संक्षेप में, दृष्टिकोण सत्यापन की चेतावनी प्रकार का समर्थन सभी दृश्य मॉडल के लिए
- एक कस्टम डेटा एनोटेशन विशेषता बनाने के लिए है;
- एक ज्ञात आधार वर्ग जो दिखाई देने वाले मॉडल से प्राप्त कर लेगा;
- हम एक कस्टम विशेषता के लिए जावास्क्रिप्ट में तर्क नकल करना होगा।
कृपया ध्यान दें कि नीचे दिया गया कोड केवल दृष्टिकोण को दिखाता है और मुझे पूर्ण संदर्भ जानने के बिना बहुत सारी चीजें माननी हैं।
देखें मॉडल
इस परिदृश्य में यह एक वास्तविक मॉडल है जो एक अच्छा विचार वैसे भी है से एक दृश्य मॉडल अलग करने के लिए सबसे अच्छा है। एक संभव दृष्टिकोण है जो की चेतावनियों का समर्थन सभी दृश्य मॉडलों के लिए एक आधार वर्ग के लिए है:
public abstract class BaseViewModel
{
public bool IgnoreWarnings { get; set; }
}
प्रमुख कारण एक मॉडल अलग होने की जरूरत है अपने डेटाबेस में IgnoreWarnings
संपत्ति भंडारण में थोड़ा समझ में नहीं है कि है।
आपका व्युत्पन्न दृश्य मॉडल तो के रूप में दिखाई देगा इस प्रकार है:
public class YourViewModel : BaseViewModel
{
[Required]
[StringLengthWarning(MaximumLength = 5, ErrorMessage = "Your Warning Message")]
public string YourProperty { get; set; }
}
StringLengthWarning
सर्वर और क्लाइंट साइड सत्यापन के लिए एक कस्टम डेटा एनोटेशन विशेषता है। यह सिर्फ अधिकतम लंबाई का समर्थन करता है और आसानी से किसी भी अन्य आवश्यक गुणों के साथ बढ़ाया जा सकता है।
डाटा एनोटेशन गुण
विशेषता के मुख्य IsValid(value, validationContext
तरीका है।
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class StringLengthWarningAttribute : ValidationAttribute, IClientValidatable
{
public int MaximumLength { get; set; }
public override bool IsValid(object value)
{
return true;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = validationContext.ObjectInstance as BaseViewModel;
var str = value as string;
if (!model.IgnoreWarnings && (string.IsNullOrWhiteSpace(str) || str.Length > MaximumLength))
return new ValidationResult(ErrorMessage);
return base.IsValid(value, validationContext);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new StringLengthWarningValidationRule(MaximumLength, ErrorMessage);
}
}
विशेषता IClientValidatable
लागू करता है और एक कस्टम ग्राहक सत्यापन नियम का इस्तेमाल करता है:
public class StringLengthWarningValidationRule : ModelClientValidationRule
{
public StringLengthWarningValidationRule(int maximumLength, string errorMessage)
{
ErrorMessage = errorMessage;
ValidationType = "stringlengthwarning";
ValidationParameters.Add("maximumlength", maximumLength);
ValidationParameters.Add("ignorewarningsfield", "IgnoreWarnings");
}
}
क्लाइंट-साइड JavaScript
अंत में, यह काम करने के लिए, आप निम्न जावास्क्रिप्ट की आवश्यकता होगी
$(function() {
$.validator.addMethod('stringlengthwarning', function (value, element, params) {
var maximumlength = params['maximumlength'];
var ignorewarningsfield = params['ignorewarningsfield'];
var ctl = $("#" + ignorewarningsfield);
if (ctl == null || ctl.is(':checked'))
return true;
return value.length <= maximumlength;
});
$.validator.unobtrusive.adapters.add("stringlengthwarning", ["maximumlength", "ignorewarningsfield"], function (options) {
var value = {
maximumlength: options.params.maximumlength,
ignorewarningsfield: options.params.ignorewarningsfield
};
options.rules["stringlengthwarning"] = value;
if (options.message) {
options.messages["stringlengthwarning"] = options.message;
}
});
}(jQuery));
: आपके विचार से संदर्भित
जावास्क्रिप्ट कुछ मान्यताओं आप (चेक-बॉक्स नाम, आदि) को फिर से करना चाह सकते हैं बनाता है।
अद्यतन: HTML सहायकों
त्रुटियों और चेतावनियों के लिए अलग से सत्यापन संदेश प्रदर्शित करने के लिए सहायकों की एक जोड़ी के लिए आवश्यक हो जाएगा।
public static class MessageHelpers
{
public static MvcHtmlString WarningMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
if (htmlHelper.ViewData.ModelState["IgnoreWarnings"] != null)
return htmlHelper.ValidationMessageFor(expression);
return MvcHtmlString.Empty;
}
public static MvcHtmlString ErrorMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
if (htmlHelper.ViewData.ModelState["IgnoreWarnings"] == null)
return htmlHelper.ValidationMessageFor(expression);
return MvcHtmlString.Empty;
}
}
दृश्य वे सामान्य रूप से इस्तेमाल किया जा सकता है::
@Html.EditorFor(model => model.YourProperty)
@Html.ErrorMessageFor(model => model.YourProperty)
@Html.WarningMessageFor(model => model.YourProperty)
मैं मान लीजिए कि आप एक विशेषता के रूप में '[चेतावनीऑनफिल्ल्ड लम्बाई (150)]' की तरह कुछ चाहते हैं? –
@TiesonT। हाँ बिल्कुल। – Alex
इस उत्तर की तरह कुछ आपको वहां भाग लेता है: http://stackoverflow.com/a/9652582/534109 - विशेषता का उपयोग विस्तार के लिए एक हुक उत्पन्न करने के लिए किया जा सकता है, मानते हुए कि आप दृढ़ता से प्रकार के हेल्पर्स का उपयोग करना चाहते हैं। मैं देखूंगा कि क्या मैं वास्तविक जवाब के लिए कुछ एक साथ स्क्रैप कर सकता हूं ... –