LessThanOrEqualTo
या GreaterThanOrEqualTo
नियमों का न तो ग्राहक साइड सत्यापन के द्वारा समर्थित हैं के रूप में documentation में विस्तार से बताया।
इसका मतलब यह है कि अगर आप उनके लिए ग्राहक साइड सत्यापन करना चाहते हैं आप एक कस्टम FluentValidationPropertyValidator
लिखने और GetClientValidationRules
विधि है जो आप एक कस्टम एडाप्टर रजिस्टर करने की अनुमति देगा को लागू करने और जावास्क्रिप्ट में इसके लिए ग्राहक साइड सत्यापन तर्क को लागू करने की आवश्यकता होगी ।
यदि आप रुचि रखते हैं कि यह कैसे प्राप्त किया जा सकता है तो मुझे बस पिंग करें और मैं एक उदाहरण प्रदान करूंगा।
अद्यतन:
अनुरोध के रूप में, मैं कैसे एक LessThanOrEqualTo
शासन के लिए कस्टम ग्राहक साइड सत्यापन को लागू कर सकता का एक उदाहरण दिखाने का प्रयास करेगा। यह गैर-निरर्थक तिथियों के साथ केवल एक विशेष मामला है। सभी संभावित मामलों के लिए ऐसे कस्टम क्लाइंट साइड वैलिडेटर को लिखना निश्चित रूप से संभव है लेकिन इसके लिए काफी अधिक प्रयासों की आवश्यकता होगी।
तो हम एक दृश्य के मॉडल और एक इसी सत्यापनकर्ता के साथ शुरू:
[Validator(typeof(MyViewModelValidator))]
public class MyViewModel
{
[Display(Name = "Start date")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime StartDate { get; set; }
public DateTime DateToCompareAgainst { get; set; }
}
public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
public MyViewModelValidator()
{
RuleFor(x => x.StartDate)
.LessThanOrEqualTo(x => x.DateToCompareAgainst)
.WithMessage("Invalid start date");
}
}
फिर एक नियंत्रक:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
StartDate = DateTime.Now.AddDays(2),
DateToCompareAgainst = DateTime.Now
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
और एक दृश्य:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.Hidden("DateToCompareAgainst", Model.DateToCompareAgainst.ToString("yyyy-MM-dd"))
@Html.LabelFor(x => x.StartDate)
@Html.EditorFor(x => x.StartDate)
@Html.ValidationMessageFor(x => x.StartDate)
<button type="submit">OK</button>
}
यह सब
मानक सामान है अब तक। यह काम करेगा लेकिन ग्राहक सत्यापन के बिना।
पहला कदम लिखना है FluentValidationPropertyValidator
:
public class LessThanOrEqualToFluentValidationPropertyValidator : FluentValidationPropertyValidator
{
public LessThanOrEqualToFluentValidationPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator)
: base(metadata, controllerContext, rule, validator)
{
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
if (!this.ShouldGenerateClientSideRules())
{
yield break;
}
var validator = Validator as LessThanOrEqualValidator;
var errorMessage = new MessageFormatter()
.AppendPropertyName(this.Rule.GetDisplayName())
.BuildMessage(validator.ErrorMessageSource.GetString());
var rule = new ModelClientValidationRule
{
ErrorMessage = errorMessage,
ValidationType = "lessthanorequaldate"
};
rule.ValidationParameters["other"] = CompareAttribute.FormatPropertyForClientValidation(validator.MemberToCompare.Name);
yield return rule;
}
}
जो Application_Start
में पंजीकृत किया जाएगा जब हमारे FluentValidation प्रदाता को विन्यस्त:
FluentValidationModelValidatorProvider.Configure(x =>
{
x.Add(typeof(LessThanOrEqualValidator), (metadata, context, rule, validator) => new LessThanOrEqualToFluentValidationPropertyValidator(metadata, context, rule, validator));
});
और आखिरी बिट ग्राहक पर कस्टम एडाप्टर है ।
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
और कस्टम अनुकूलक:
(function ($) {
$.validator.unobtrusive.adapters.add('lessthanorequaldate', ['other'], function (options) {
var getModelPrefix = function (fieldName) {
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
};
var appendModelPrefix = function (value, prefix) {
if (value.indexOf("*.") === 0) {
value = value.replace("*.", prefix);
}
return value;
}
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];
options.rules['lessthanorequaldate'] = element;
if (options.message != null) {
options.messages['lessthanorequaldate'] = options.message;
}
});
$.validator.addMethod('lessthanorequaldate', function (value, element, params) {
var parseDate = function (date) {
var m = date.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);
return m ? new Date(parseInt(m[1]), parseInt(m[2]) - 1, parseInt(m[3])) : null;
};
var date = parseDate(value);
var dateToCompareAgainst = parseDate($(params).val());
if (isNaN(date.getTime()) || isNaN(dateToCompareAgainst.getTime())) {
return false;
}
return date <= dateToCompareAgainst;
});
})(jQuery);
क्या आप वाकई पहले काम करते हैं? 'LessThanOrEqualTo' क्लाइंट सत्यापन द्वारा समर्थित होने के रूप में [प्रलेखन] (http://fluentvalidation.codeplex.com/wikipage?title=mvc&referringTitle=Documentation) में सूचीबद्ध नियमों में से एक नहीं है। आप किस एफवी का उपयोग कर रहे हैं? –
ओह आदमी !! यह 'LessThanOrEqualTo' था इसके लिए कोई काम है? – iwayneo