c# - एमवीसी प्रमाणीकरण अन्य मूल्य से कम / उच्च




asp.net-mvc asp.net-mvc-3 model data-annotations (5)

Foolproof नामक एक NuGet पैकेज है जो आपके लिए इन टिप्पणियां प्रदान करता है। उस ने कहा - एक कस्टम विशेषता लिखना बहुत आसान और अच्छी प्रैक्टिस दोनों है।

मूर्खप्रवाह का उपयोग करना इस तरह दिखेगा:

public class FinanceModel{
   public int MinimumCost {get;set;}

   [GreaterThan("MinimumCost")]
   public int MaximumCost {get;set;}
}

MVC.Net में किसी मॉडल को सत्यापित करने का सबसे अच्छा तरीका कैसा है जहां मैं न्यूनतम / अधिकतम स्वीकार करना चाहता हूं।

किसी फ़ील्ड के लिए व्यक्तिगत न्यूनतम / अधिकतम मान नहीं। लेकिन उपयोगकर्ता के लिए न्यूनतम / अधिकतम निर्दिष्ट करने के लिए अलग-अलग फ़ील्ड।

public class FinanceModel{
   public int MinimumCost {get;set;}
   public int MaximumCost {get;set;}
}

तो मुझे यह सुनिश्चित करने की ज़रूरत है कि न्यूनतम लागत हमेशा अधिकतम लागत से कम है।


पूर्णांक के लिए वीबी में:

आदर्श

<UtilController.IsIntegerGreatherOrEqualThan("PropertyNameNumberBegins", "PeriodErrorMessage")>
        Public Property PropertyNameNumberEnds As Nullable(Of Integer)

सत्यापन

Public Class IsIntegerGreatherOrEqualThan
        Inherits ValidationAttribute

        Private otherPropertyName As String
        Private errorMessage As String

        Public Sub New(ByVal otherPropertyName As String, ByVal errorMessage As String)
            Me.otherPropertyName = otherPropertyName
            Me.errorMessage = errorMessage
        End Sub

        Protected Overrides Function IsValid(thisPropertyValue As Object, validationContext As ValidationContext) As ValidationResult

            Dim otherPropertyTestedInfo = validationContext.ObjectType.GetProperty(Me.otherPropertyName)

            If (otherPropertyTestedInfo Is Nothing) Then
                Return New ValidationResult(String.Format("unknown property {0}", Me.otherPropertyName))
            End If

            Dim otherPropertyTestedValue = otherPropertyTestedInfo.GetValue(validationContext.ObjectInstance, Nothing)

            If (thisPropertyValue Is Nothing) Then
                Return ValidationResult.Success
            End If

            ''  Compare values
            If (CType(thisPropertyValue, Integer) >= CType(otherPropertyTestedValue, Integer)) Then
                Return ValidationResult.Success
            End If

            ''  Wrong
            Return New ValidationResult(errorMessage)
        End Function
    End Class

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

सबसे पहले, यहां मॉडल है:

public DateTime Beggining { get; set; }

    [IsDateAfterAttribute("Beggining", true, ErrorMessageResourceType = typeof(LocalizationHelper), ErrorMessageResourceName = "PeriodErrorMessage")]
    public DateTime End { get; set; }

और यहां विशेषता ही है:

public sealed class IsDateAfterAttribute : ValidationAttribute, IClientValidatable
{
    private readonly string testedPropertyName;
    private readonly bool allowEqualDates;

    public IsDateAfterAttribute(string testedPropertyName, bool allowEqualDates = false)
    {
        this.testedPropertyName = testedPropertyName;
        this.allowEqualDates = allowEqualDates;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var propertyTestedInfo = validationContext.ObjectType.GetProperty(this.testedPropertyName);
        if (propertyTestedInfo == null)
        {
            return new ValidationResult(string.Format("unknown property {0}", this.testedPropertyName));
        }

        var propertyTestedValue = propertyTestedInfo.GetValue(validationContext.ObjectInstance, null);

        if (value == null || !(value is DateTime))
        {
            return ValidationResult.Success;
        }

        if (propertyTestedValue == null || !(propertyTestedValue is DateTime))
        {
            return ValidationResult.Success;
        }

        // Compare values
        if ((DateTime)value >= (DateTime)propertyTestedValue)
        {
            if (this.allowEqualDates && value == propertyTestedValue)
            {
                return ValidationResult.Success;
            }
            else if ((DateTime)value > (DateTime)propertyTestedValue)
            {
                return ValidationResult.Success;
            }
        }

        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessageString,
            ValidationType = "isdateafter"
        };
        rule.ValidationParameters["propertytested"] = this.testedPropertyName;
        rule.ValidationParameters["allowequaldates"] = this.allowEqualDates;
        yield return rule;
    }

आप रेंज वैलिडेटर का उपयोग क्यों नहीं करते हैं। वाक्य - विन्यास:

    [Range(typeof(int), "0", "100", ErrorMessage = "{0} can only be between {1} and {2}")]
    public int Percentage { get; set; }

आप कस्टम डेटाटाइम का उपयोग करके उपयोग कर सकते हैं ...

 create table noteTable3 
 (created_at DATETIME DEFAULT (STRFTIME('%d-%m-%Y   %H:%M', 'NOW','localtime')),
 title text not null, myNotes text not null);

वर्तमान सिस्टम दिनांक प्राप्त करने के लिए 'अब', 'लोकलटाइम' का उपयोग करें, अन्यथा यह आपके डीबी में सम्मिलन समय के बाद आपके डेटाबेस में कुछ अतीत या अन्य समय दिखाएगा।

धन्यवाद...







c# asp.net-mvc asp.net-mvc-3 model data-annotations