এএসপি.নেট এমভিসি: ডেটাঅ্যানোটেশন দ্বারা কাস্টম বৈধকরণ


110

আমার কাছে 4 টি বৈশিষ্ট্যযুক্ত একটি মডেল রয়েছে যা টাইপ স্ট্রিংয়ের। আমি জানি আপনি স্ট্রিংলংথ টীকাটি ব্যবহার করে একটি একক সম্পত্তির দৈর্ঘ্য যাচাই করতে পারবেন। তবে আমি সংযুক্ত 4 টি বৈশিষ্ট্যের দৈর্ঘ্যটি বৈধ করতে চাই।

ডেটা টিকা দিয়ে এমভিসি এটি করার কী উপায়?

আমি এটি জিজ্ঞাসা করছি কারণ আমি এমভিসিতে নতুন এবং আমার নিজের সমাধান করার আগে সঠিক উপায়ে এটি করতে চাই।


2
আপনি কি সাবলীল বৈধতার দিকে নজর রেখেছেন? এটি ডেটা টীকাগুলির চেয়ে জটিল পরিস্থিতিগুলি পরিচালনা করে
8.35 এ স্তরকে

অত্যন্ত প্রস্তাবিত সমাধানগুলি একবার দেখুন ... dotnetcurry.com/ShowArticle.aspx?ID=776
নিকস

উত্তর করার জন্য ধন্যবাদ. আমি ফ্লুয়েন্ট ভ্যালিডেশন চেক করব, এর আগে কখনও শুনিনি। এবং নিকস, ডারিন মূলত আপনার পোস্ট করা লিঙ্কের নিবন্ধটি কী ব্যাখ্যা করেছে তা লিখেছিলেন। সুতরাং, আপনাকে ধন্যবাদ ... দুর্দান্ত জিনিস!
ড্যানি ভ্যান ডের ক্রান

উত্তর:


177

আপনি একটি কাস্টম বৈধতা বৈশিষ্ট্য লিখতে পারেন:

public class CombinedMinLengthAttribute: ValidationAttribute
{
    public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
    {
        this.PropertyNames = propertyNames;
        this.MinLength = minLength;
    }

    public string[] PropertyNames { get; private set; }
    public int MinLength { get; private set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
        var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>();
        var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
        if (totalLength < this.MinLength)
        {
            return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }
        return null;
    }
}

এবং তারপরে আপনার কাছে একটি ভিউ মডেল থাকতে পারে এবং এর সাথে এটির একটি বৈশিষ্ট্য সাজাতে পারে:

public class MyViewModel
{
    [CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")]
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}

4
উত্তর দেওয়ার জন্য ধন্যবাদ, আমি আপনার উত্তর গ্রহণ করেছি। আসলে কিছুটা বিব্রত বোধ করবেন। আপনি সম্পূর্ণ সমাধান লিখেছেন! হে হে। সর্বাধিক দৈর্ঘ্যের জন্য পরীক্ষা করতে কেবল ইসভিলড ফাংশনটি পরিবর্তন করতে হয়েছিল। তাহলে এই ধরণের সমস্যার জন্য এটি কি স্বীকৃত এমভিসি সমাধান?
ড্যানি ভ্যান ডের ক্রান

7
@ ড্যানিভান্ডারক্রান, হ্যাঁ, এটি গ্রহণযোগ্য উপায়। অবশ্যই এটি এত খারাপভাবে চুষে যায় যে আমি কখনই এটি ব্যবহার করি না এবং বৈধতা সম্পাদনের পরিবর্তে ফ্লুয়েন্টভ্ল্যাডেশন N নেট ব্যবহার করি।
দারিন দিমিত্রভ

11
এখানে: ফ্লুয়েন্টিওয়েলেশন.কোডেপ্লেক্স.কম । আপনি শুধু যে ভালো লাগছিল থাকতে পারে দৃশ্য মডেল জন্য একটি সহজ যাচাইকারী (কোড একটি একক লাইন) লিখেছি পারে: this.RuleFor(x => x.Foo).Must((x, foo) => x.Foo.Length + x.Bar.Length + x.Baz.Length < 20).WithMessage("The combined minimum length of the Foo, Bar and Baz properties should be longer than 20");। এখন আমার উত্তরে কোডটি দেখুন যে আপনাকে ডেটা টিকা দিয়ে লিখতে হবে এবং আপনি কোনটি পছন্দ করেন তা আমাকে জানান। অপরিহার্য মডেলের তুলনায় ঘোষিত বৈধতা মডেলটি খুব দুর্বল।
দারিন দিমিত্রভ

1
এটি কিছুটা দেরি হয়ে গেছে, তবে কেউ কি জানেন যে কাস্টম ডেটা টিকা রচনার জন্য আপনাকে "চালু" করতে হবে এমন একটি আলাদা সেটিংস রয়েছে কিনা? আমি ওয়েলকনফাইগ ফাইলে অবিস্মরণীয় জেএসের জন্য একটি নেমস্পেস যুক্ত করার বিষয়ে জানি তবে অন্য কোথাও?
জোস

1
আমি সারা সকালে এই সন্ধান করছি ! আমি এটিকে বিভ্রান্ত করেছি এবং দুর্ভাগ্যক্রমে যখন IsValidডাকা হয় তখন validationContextতা বাতিল হয়। কোন ধারণা আমি কি ভুল করেছি? :-(
গ্রিম দ্য Opiner

95

স্ব স্বীকৃত মডেল

আপনার মডেলটির একটি ইন্টারফেস প্রয়োগ করা উচিত IValidatableObjectValidateপদ্ধতিতে আপনার বৈধতা কোড দিন :

public class MyModel : IValidatableObject
{
    public string Title { get; set; }
    public string Description { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Title == null)
            yield return new ValidationResult("*", new [] { nameof(Title) });

        if (Description == null)
            yield return new ValidationResult("*", new [] { nameof(Description) });
    }
}

দয়া করে লক্ষ্য করুন: এটি একটি সার্ভার-সাইড বৈধতা। এটি ক্লায়েন্ট-সাইডে কাজ করে না। আপনার বৈধতা ফর্ম জমা দেওয়ার পরেই সম্পাদিত হবে।


আন্ড্রেই উত্তর দেওয়ার জন্য ধন্যবাদ। আপনার সমাধানটি খুব কার্যকর হলেও আমি ডারিনকে বেছে নিই কারণ এটি আরও পুনরায় ব্যবহারযোগ্য।
ড্যানি ভ্যান ডের ক্রান

6
নতুন নতুন বৈধকরণের ফলাফলের ফলাফল দিন ("শিরোনাম বাধ্যতামূলক" "," শিরোনাম "); প্রপার্টি নাম যুক্ত করবে, যদি প্রয়োজন হয় প্রদর্শনের জন্য বৈধতা ত্রুটি গোষ্ঠীকরণে দরকারী।
মাইক কিংসকোট

5
নোট করুন যে সমস্ত বৈধতা বৈশিষ্ট্য বৈধতা পাস করার পরে এই বৈধতা পদ্ধতিটি শুধুমাত্র ডাকা হবে।
পেড্রো

3
এটি আমার পক্ষে ভাল কাজ করেছে যেহেতু আমার বৈধতা খুব নির্দিষ্ট। বৈধতা পুনরায় ব্যবহার করা হচ্ছে না বিধায় একটি কাস্টম বৈশিষ্ট্য যুক্ত করা আমার পক্ষে ওভারকিল হত।
স্টিভ এস

এই আমি খুঁজছি। ধন্যবাদ!
অমল যাদব

27

এক্সপ্রেসিভ অ্যানোটেশনগুলি আপনাকে এমন সম্ভাবনা দেয়:

[Required]
[AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")]
public string FieldA { get; set; }

এটা অসাধারণ! আমার প্রার্থনার উত্তর পেয়েছে :)
Korayem

এই উত্তরটি সবেমাত্র পাওয়া গেছে এবং এটি কেবলমাত্র সময়ের প্রচুর সঞ্চয় করেছে। এক্সপ্রেসিভ অ্যানোটেশনগুলি উজ্জ্বল!
ব্র্যাড

10

ডারিনের উত্তরের উন্নতি করতে, এটি কিছুটা ছোট হতে পারে:

public class UniqueFileName : ValidationAttribute
{
    private readonly NewsService _newsService = new NewsService();

    public override bool IsValid(object value)
    {
        if (value == null) { return false; }

        var file = (HttpPostedFile) value;

        return _newsService.IsFileNameUnique(file.FileName);
    }
}

মডেল:

[UniqueFileName(ErrorMessage = "This file name is not unique.")]

মনে রাখবেন যে একটি ত্রুটি বার্তা প্রয়োজন, অন্যথায় ত্রুটি খালি থাকবে।


8

পটভূমি:

আমরা প্রাপ্ত প্রাপ্ত ডেটা বৈধ এবং সঠিক কিনা তা নিশ্চিত করার জন্য মডেল বৈধতাগুলির প্রয়োজন হয় যাতে আমরা এই ডেটা দিয়ে আরও প্রক্রিয়াজাতকরণ করতে পারি। আমরা একটি ক্রিয়া পদ্ধতিতে কোনও মডেলকে বৈধতা দিতে পারি। অন্তর্নির্মিত বৈধতা বৈশিষ্ট্যগুলি তুলনা, ব্যাপ্তি, নিয়মিত এক্সপ্রেসন, প্রয়োজনীয়, স্ট্রিংলেন্থ। তবে আমাদের এমন পরিস্থিতি থাকতে পারে যেখানে অন্তর্নির্মিতগুলি বাদে আমাদের বৈধতার বৈশিষ্ট্যগুলির প্রয়োজন।

কাস্টম বৈধকরণ বৈশিষ্ট্য

public class EmployeeModel 
{
    [Required]
    [UniqueEmailAddress]
    public string EmailAddress {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int OrganizationId {get;set;}
}

একটি কাস্টম বৈধতা বৈশিষ্ট্য তৈরি করতে, আপনাকে এই শ্রেণিটি বৈধকরণঅ্যাট্রিবিউট থেকে নেওয়া হবে।

public class UniqueEmailAddress : ValidationAttribute
{
    private IEmployeeRepository _employeeRepository;
    [Inject]
    public IEmployeeRepository EmployeeRepository
    {
        get { return _employeeRepository; }
        set
        {
            _employeeRepository = value;
        }
    }
    protected override ValidationResult IsValid(object value,
                        ValidationContext validationContext)
    {
        var model = (EmployeeModel)validationContext.ObjectInstance;
        if(model.Field1 == null){
            return new ValidationResult("Field1 is null");
        }
        if(model.Field2 == null){
            return new ValidationResult("Field2 is null");
        }
        if(model.Field3 == null){
            return new ValidationResult("Field3 is null");
        }
        return ValidationResult.Success;
    }
}

আশাকরি এটা সাহায্য করবে. চিয়ার্স!

তথ্যসূত্র


1

উত্তর দিতে কিছুটা দেরি, তবে কে অনুসন্ধান করছে। আপনি সহজেই ডেটা টিকা দিয়ে অতিরিক্ত সম্পত্তি ব্যবহার করে এটি করতে পারেন:

public string foo { get; set; }
public string bar { get; set; }

[MinLength(20, ErrorMessage = "too short")]
public string foobar 
{ 
    get
    {
        return foo + bar;
    }
}

আসলেই এটি খুব বেশি। আপনি যদি সত্যিই কোনও নির্দিষ্ট জায়গায় বৈধতা ত্রুটি প্রদর্শন করতে চান তবে আপনি এটি নিজের দৃষ্টিতে যোগ করতে পারেন:

@Html.ValidationMessage("foobar", "your combined text is too short")

আপনি স্থানীয়করণ করতে চাইলে এই দৃষ্টিতে এটি করা কার্যকর হতে পারে।

আশাকরি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.