নির্দিষ্ট পরিস্থিতিতে প্রয়োজনীয় বৈধতা বৈশিষ্ট্যটি অক্ষম করুন


138

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

এই সমস্যাটি কীভাবে পাওয়া যায় তার উপর কোনও চাপ?

সম্পাদনা:
এবং হ্যাঁ ক্লায়েন্টের বৈধতা এখানে একটি সমস্যা, কারণ এটি কোনও মান প্রবেশ না করে ফর্মটি জমা দেওয়ার অনুমতি দেয় না।


3
+1 ভাল প্রশ্ন। এখানে ক্লায়েন্টের বৈধতা উল্লেখ করা ভাল। একটি বিকল্প হ'ল RequiredAttrসম্পূর্ণ অপসারণ এবং আপনার যখন প্রয়োজন হবে তখন একটি সার্ভার সাইড চেক করুন তবে এটি ক্লায়েন্টের পক্ষে জটিল হবে
জিডিয়ন

4
ক্লায়েন্টের বৈধতা থেকে কিছু ক্ষেত্রগুলি অক্ষম করার বিষয়েও আবশ্যক এমন পয়েন্টস (জেকারি বৈধতার উল্লেখগুলি সরিয়ে নেই)
জিডিয়ন

হতে পারে আমি আপনার পয়েন্টটি মিস করছি তবে ব্যবহারকারী যদি ইতিমধ্যে মানগুলি আগেই নির্দিষ্ট করে দিয়ে থাকে তবে সেই মানগুলি ইতিমধ্যে উপস্থিত রয়েছে এবং সুতরাং প্রয়োজনীয় বৈধতাটি পাস করবে। আপনি অন্য কিছু বলতে চাইছেন?
এরিক ফানকেনবাশ

কারণ এই মানগুলি পরে পাসওয়ার্ড এবং সুরক্ষা উত্তর হিসাবে ধুয়ে ফেলা হয়েছে, সুতরাং যদি তারা সম্পাদনা ফর্মটিতে একটি নতুন মান প্রবেশ করে আমি সন্নিবেশের আগে নতুন মানটি পুনরায় হ্যাশ করতে চাই তবে আমি এটির বিকল্পটি ফাঁকা রেখে দিতে চাই want সভভেওাবসগত.
অ্যালেক্স হোপ ও'কনর

1
@gideon: দেখুন আদ্রিয়ান স্মিথ উত্তর: stackoverflow.com/a/9781066/114029
Leniel Maccaferri

উত্তর:


76

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

public UpdateViewView
{
    [Required]
    public string Id { get; set; }

    ... some other properties
}

public class InsertViewModel
{
    public string Id { get; set; }

    ... some other properties
}

যা তাদের সম্পর্কিত নিয়ামক পদক্ষেপে ব্যবহৃত হবে:

[HttpPost]
public ActionResult Update(UpdateViewView model)
{
    ...
}

[HttpPost]
public ActionResult Insert(InsertViewModel model)
{
    ...
}

আপনার কাছে যদি বুলিয়ান / বিট থাকে তবে এটি যথাযথ নয় true সত্য বা মিথ্যা শেষ হতে চলেছে তবে সত্যই কোনও পার্থক্য নেই। প্রয়োজনীয় ক্ষেত্রগুলি হাইলাইট করার জন্য আমার কাছে সিএসএস ছিল এবং এটি চেকবক্সফোর্ড আইটেমটিকে ভুলভাবে হাইলাইট করেছে। আমার সমাধান: $ ("# ইসভালিউট্রু") remove
রবার্ট কোচ

আপডেটে আমরা সাধারণত (ফর্ম সংগ্রহ সংগ্রহ) করি। আপনি কীভাবে মডেলটি প্যারামিটার হিসাবে ব্যবহার করছেন তা দয়া করে ব্যাখ্যা করতে পারেন
রাজ কুমার

4
না, আমাদের সাধারণত হয় না Update(FormCollection collection), কমপক্ষে আমি কখনই করি না। আমি সবসময় সংজ্ঞায়িত একটি নির্দিষ্ট দৃশ্য মডেল ব্যবহার করুন: Update(UpdateViewView model)
দারিন দিমিত্রভ

একই HTTP ক্রিয়াকলাপের সাথে ওভারলোডিং পদ্ধতিগুলি অনুমোদিত নয়, সুতরাং আমার কাছে মনে হয় এটি কাজ করবে না। আমি কিছু অনুপস্থিত করছি?
11 ই

@ এডজি, না, আপনি কিছু মিস করছেন না। এটা আমার পোস্টে ভুল। দ্বিতীয় ক্রিয়া পদ্ধতিটি অবশ্যই বলা উচিত Insert। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
ডারিন দিমিত্রভ

55

আপনি যদি কেবল ক্লায়েন্টের পক্ষে একক ক্ষেত্রের জন্য বৈধতা অক্ষম করতে চান তবে আপনি বৈধতা বৈশিষ্ট্যগুলি নিম্নরূপে ওভাররাইড করতে পারেন:

@Html.TexBoxFor(model => model.SomeValue, 
                new Dictionary<string, object> { { "data-val", false }})

20
JQuery এর মাধ্যমে আমার পক্ষে কী কাজ করেছে: $ ("# সামোভ্যালু") remove "অপসারণ" ("ডেটা-ভাল-প্রয়োজনীয়");
রবার্ট কোচ

6
আমি এই পদ্ধতির পছন্দ করি তবে ফর্মের বৈধতা বৈশিষ্ট্যগুলিকে পুনরায় পার্স করতে হবে: $ ('ফর্ম') remove মুছে ফেলুন ডেটা ('নিরবিচ্ছিন্ন ভ্যালিডেশন'); $ ( 'ফর্ম') removeData ( 'যাচাইকারী')। valid .)ator.unobtrusive.parse ('আপনার ফর্মের জন্য নির্বাচক');
ইয়ানিক স্মিটস

15
@Html.TexBoxFor(model => model.SomeValue, new { data_val = false })- আইএমও পড়া সহজ।
eth0

আমি প্রতিটি ক্ষেত্রের সূক্ষ্ম নিয়ন্ত্রণ দিতে আমাকে এই পদ্ধতির বেশিরভাগটি পছন্দ করেছিলাম তবে আপনি পোস্টস্টের মাধ্যমে সংরক্ষণের জন্য ডেটা প্রেরণ করার সময় মডেলস্টেট.আইএসভিড বাতিল করতে পারেন। কিছুটা ঝুঁকির কারণ হতে পারে?
ফিলিপ এফএমএমবাইল

4
আপনি যদি jQuery এর মাধ্যমে এটি অক্ষম করতে চান:$(".search select").attr('data-val', false);
লেনিয়েল ম্যাকাফেরি

40

আমি জানি এই প্রশ্নের উত্তর অনেক দিন আগে দেওয়া হয়েছে এবং স্বীকৃত উত্তরটি আসলে কাজটি করবে। তবে একটি জিনিস যা আমাকে বিরক্ত করে: কেবলমাত্র একটি বৈধতা অক্ষম করার জন্য 2 টি মডেল অনুলিপি করতে হবে।

আমার পরামর্শটি এখানে:

public class InsertModel
{
    [Display(...)]
    public virtual string ID { get; set; }

    ...Other properties
}

public class UpdateModel : InsertModel
{
    [Required]
    public override string ID
    {
        get { return base.ID; }
        set { base.ID = value; }
    }
}

এইভাবে, আপনাকে ক্লায়েন্ট / সার্ভারের পার্শ্বের বৈধতাগুলির সাথে বিরক্ত করতে হবে না, ফ্রেমওয়ার্কটি এটি অনুমিতভাবে আচরণ করবে। এছাড়াও, যদি আপনি [Display]বেস শ্রেণীর কোনও বৈশিষ্ট্য সংজ্ঞায়িত করেন তবে আপনাকে এটিতে আপনার নতুন সংজ্ঞা দিতে হবে না UpdateModel

এবং আপনি এখনও এই ক্লাসগুলি একইভাবে ব্যবহার করতে পারেন:

[HttpPost]
public ActionResult Update(UpdateModel model)
{
    ...
}

[HttpPost]
public ActionResult Insert(InsertModel model)
{
    ...
}

আমি এই পদ্ধতির আরও ভাল পছন্দ করি, বিশেষত যদি আপনার বৈধতার বৈশিষ্ট্যের একটি দীর্ঘ তালিকা থাকে। আপনার উদাহরণে, সুবিধাটি আরও সুস্পষ্ট হওয়ার জন্য আপনি বেস শ্রেণিতে আরও গুণাবলী যুক্ত করতে পারেন। আমি দেখতে পাচ্ছি একমাত্র অসুবিধা হ'ল বৈশিষ্ট্যগুলিকে ওভাররাইড করার জন্য বৈশিষ্ট্যগুলির উত্তরাধিকারের কোনও উপায় নেই। উদাহরণস্বরূপ, যদি বেস শ্রেণিতে আপনার [প্রয়োজনীয়] সম্পত্তি থাকে তবে উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তিকে [আবশ্যক] করতে বাধ্য করা হবে, যদি না আপনার নিজস্ব কাস্টম [Oচ্ছিক] বৈশিষ্ট্য থাকে।
ইওরো

আমি এটির মতোও কিছু ভেবেছিলাম, যদিও আমার কাছে একটি ভিউমোডেল রয়েছে যার একটি প্রকল্প 'প্রজেক্ট' রয়েছে যার একাধিক বৈশিষ্ট্য রয়েছে এবং আমি এই বৈশিষ্ট্যগুলির মধ্যে একটি নির্দিষ্ট কিছু পরিস্থিতিতে বৈধ হওয়া চাই want আমি মনে করি না যে আমি ঠিক কোনও অবজেক্টের একটি বৈশিষ্ট্যকে ওভাররাইড করতে পারি? কোন পরামর্শ?
ভিনসেন্ট ডি জি

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

1
সর্বাধিক মার্জিত, পুনরায় ব্যবহারযোগ্য, পরিষ্কার সমাধান। প্রতিলিপিগুলি খারাপ। পলিমারফিজম হল উপায়। +1
টি-মোটি

আমার ক্ষেত্রে একটি বেস শ্রেণীর একটি প্রয়োজনীয় বৈশিষ্ট্য রয়েছে এবং আমি এটি আমার পিতামাতার ক্লাসে অপ্রয়োজনীয় করতে চাই। মডেলের দুটি অনুলিপি না থাকলে কি এটি সম্ভব?
আলেক্সি স্ট্র্যাখ

27

আপনি আপনার নিয়ামক ক্রিয়াকলাপে নীচের সাথে কোনও সম্পত্তি থেকে সমস্ত বৈধতা মুছে ফেলতে পারেন।

ModelState.Remove<ViewModel>(x => x.SomeProperty);

এমভিসি 5 সম্পর্কে @ আয়ানের মন্তব্য

নিম্নলিখিত এখনও সম্ভব

ModelState.Remove("PropertyNameInModel");

বিট বিরক্তিকর যে আপনি আপডেট হওয়া এপিআই দিয়ে স্থির টাইপিং হারাবেন। আপনি HTML সহায়তার একটি উদাহরণ তৈরি করে এবং নেম এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে পুরানো উপায়ে অনুরূপ কিছু অর্জন করতে পারেন ।


বাদে ... ModelStateসেই স্বাক্ষরের সাথে মেলে এমন কোনও পদ্ধতি নেই । এমভিসি 5 তে অন্তত নয়।
ইয়ান কেম্প

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

15

ক্লায়েন্ট পক্ষ কোনও ফর্মের বৈধতা অক্ষম করার জন্য, আমার গবেষণার উপর ভিত্তি করে একাধিক বিকল্প নীচে দেওয়া হয়েছে। তাদের মধ্যে একটি আশা করি আপনার জন্য কাজ করবে।

বিকল্প 1

আমি এটি পছন্দ করি এবং এটি আমার পক্ষে নিখুঁতভাবে কাজ করে।

(function ($) {
    $.fn.turnOffValidation = function (form) {
        var settings = form.validate().settings;

        for (var ruleIndex in settings.rules) {
            delete settings.rules[ruleIndex];
        }
    };
})(jQuery); 

এবং এটি পছন্দ মত

$('#btn').click(function () {
    $(this).turnOffValidation(jQuery('#myForm'));
});

বিকল্প 2

$('your selector here').data('val', false);
$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");

বিকল্প 3

var settings = $.data($('#myForm').get(0), 'validator').settings;
settings.ignore = ".input";

বিকল্প 4

 $("form").get(0).submit();
 jQuery('#createForm').unbind('submit').submit();

বিকল্প 5

$('input selector').each(function () {
    $(this).rules('remove');
});

সার্ভার সাইড

একটি বৈশিষ্ট্য তৈরি করুন এবং সেই বৈশিষ্ট্যের সাথে আপনার ক্রিয়া পদ্ধতিটি চিহ্নিত করুন। আপনার নির্দিষ্ট প্রয়োজনের সাথে খাপ খাইয়ে নিতে এটি কাস্টমাইজ করুন।

[AttributeUsage(AttributeTargets.All)]
public class IgnoreValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var modelState = filterContext.Controller.ViewData.ModelState;

        foreach (var modelValue in modelState.Values)
        {
            modelValue.Errors.Clear();
        }
    }
}

এখানে আরও ভাল পদ্ধতির বর্ণনা দেওয়া হয়েছে এমভিসি সার্ভার সাইডের বৈধতা গতিশীলভাবে সক্ষম / অক্ষম করুন


'(' ইনপুট নির্বাচক ') each আমাকে সাহায্য করেছেন
শচীন পাকালে

প্রশ্নটি বিশেষত প্রয়োজনীয় ক্ষেত্রের বৈধতা অপসারণ সম্পর্কে ছিল, সমস্ত বৈধতা অপসারণ সম্পর্কে নয়। আপনার উত্তর সমস্ত বৈধতা অপসারণ সম্পর্কে।
রিচার্ড

14

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

আপনার আর একটি সম্ভাব্য পন্থা হ'ল আপনার ভিউ মডেল বা মডেলটি আইভিালিডেটেবলঅবজেক্ট থেকে নেওয়া। এটি আপনাকে একটি কার্যকারিতা বৈধকরণ কার্যকর করার বিকল্প দেয়। বৈধতা অনুসারে আপনি বৈধকরণের ফলাফলের উপাদানগুলির একটি তালিকা ফেরত দিতে পারেন বা যাচাইকরণের মধ্যে সনাক্ত হওয়া প্রতিটি সমস্যার জন্য একটি ফলন ফেরত জারি করতে পারেন।

বৈধকরণ ফলাফলটিতে একটি ত্রুটি বার্তা এবং ক্ষেত্রের নামগুলির সাথে স্ট্রিংয়ের তালিকা রয়েছে। ত্রুটি বার্তাগুলি ইনপুট ক্ষেত্র (গুলি) এর নিকটবর্তী স্থানে প্রদর্শিত হবে।

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
  if( NumberField < 0 )
  {
    yield return new ValidationResult( 
        "Don't input a negative number", 
        new[] { "NumberField" } );
  }

  if( NumberField > 100 )
  {
    yield return new ValidationResult( 
        "Don't input a number > 100", 
        new[] { "NumberField" } );
  }

  yield break;
}

আমরা কি ক্লায়েন্টের পাশ দিয়ে এড়াতে পারি?
মুহাম্মদ আদিল জাহিদ

ক্লায়েন্ট-পার্শ্বের বৈধতা সাধারণত ব্যক্তিগত ক্ষেত্রের জন্যই করা হয়, ব্যবহারকারীর সুবিধার্থে ইন্টারেক্টিভ, ফিল্ড-বাই-ফিল্ড বৈধতা প্রতিক্রিয়া প্রদর্শন করে। যেহেতু অবজেক্ট-বৈধকরণের ধাপটিতে সাধারণত নির্ভরযোগ্যতা (একাধিক ক্ষেত্র এবং / অথবা শর্তাবলী যা বস্তুর নিজেই বাহ্যিক হয়) জড়িত থাকে এটি অগত্যা ক্লায়েন্ট-সাইডে সম্পাদন করা যায় না, আপনি জাভাস্ক্রিপ্টে কোডটি সংকলন করতে পারলেও। যদি ক্লায়েন্ট-পক্ষের জটিল / নির্ভরশীল বৈধতা আপনার ক্ষেত্রে মান যোগ করে তবে আপনাকে অন-সাবমিট-কলব্যাক ব্যবহার করতে হবে এবং ক্লায়েন্ট-সাইডে বৈধতা যুক্তির সদৃশ করতে হবে।
mindplay.dk

7

আমি বিশ্বাস করি যে এখানে সবচেয়ে পরিষ্কার উপায় আপনার ক্লায়েন্ট পার্শ্ব বৈধতা অক্ষম করতে চলেছে এবং সার্ভার দিকে আপনার প্রয়োজন হবে:

  1. মডেলস্টেট ["সামারফিল্ড"]। ত্রুটিগুলি.মুক্ত করুন (আপনার নিয়ামকটিতে বা নিয়ন্ত্রণকারী কোড কার্যকর করার আগে ত্রুটিগুলি সরাতে একটি অ্যাকশন ফিল্টার তৈরি করুন)
  2. আপনি যখন সনাক্ত করা সমস্যাগুলির লঙ্ঘন শনাক্ত করেন তখন আপনার নিয়ামক কোড থেকে মডেলস্টেট.এডডমডেল এয়ার যুক্ত করুন।

এমনকি এখানে একটি কাস্টম ভিউ মডেল সমস্যাটি সমাধান করবে না বলে মনে হয় কারণ 'পূর্ব উত্তরের' ক্ষেত্রগুলির সংখ্যা বিভিন্ন হতে পারে। যদি সেগুলি না পান তবে কাস্টম ভিউ মডেলটি সত্যই সহজতম উপায় হতে পারে তবে উপরের কৌশলটি ব্যবহার করে আপনি আপনার বৈধতা সম্পর্কিত সমস্যাগুলি পেতে পারেন around


1
এটি কেবল আমার প্রয়োজন ছিল। আমার একটি দৃষ্টিভঙ্গি ছিল এবং এই ভিউতে পৃথক ক্রিয়া ঘটে তাই আমি পৃথক ভিউমোডেলগুলি দিয়ে এটি তৈরি করতে পারিনি। এটি একটি
কবজির

6

এটি মন্তব্যে অন্য কারও উত্তর ছিল ... তবে এটি আসল উত্তর হওয়া উচিত:

$("#SomeValue").removeAttr("data-val-required")

[Required]বৈশিষ্ট্যযুক্ত ক্ষেত্রের সাথে এমভিসি 6 তে পরীক্ষা করা

উপরে https://stackoverflow.com/users/73382/rob থেকে উত্তর চুরি হয়েছে


1
সার্ভার সাইডের বৈধতা সম্পর্কে কী?
টি-মোটি

মডেলস্টেট.ও সরান, তাই না? যাইহোক, আমার জন্য, বিষয়টি ছিল যে আমার মডেলটিতে আমার একটি দ্বিতীয় সত্তা অন্তর্ভুক্ত ছিল ... যে প্রাথমিকটিতে আমি বৈধতা চেয়েছিলাম, তবে দ্বিতীয়টিতে সেই পৃষ্ঠায় বৈধতার প্রয়োজন নেই ... সুতরাং, এই দৃশ্যের অধীনে , শুধুমাত্র জিকুয়েরি প্রয়োজনীয় ছিল।
মাইক_ম্যাথিউজ_আইআই

আমি মনে করি যে লিঙ্কটি নষ্ট হয়ে গেছে, তাই দয়া করে সম্পাদনা করুন। এটি একটি আংশিক উত্তর
টি-মোটি

এটি অদ্ভুত যে আপনি বলেছেন যে এটি এমভিসি 6 এ কাজ করে (বর্তমানে এমভিসি 6 তে আমার কাছে পরীক্ষা করার বিকল্প নেই) তবে আমি বর্তমানে এমভিসি 4 তে আমার ব্যবহার করি না।
agগলই 22

প্রশ্নটি এমভিসি / সি # এর জন্য - জেএস নয়, উত্তরটি সার্ভারের পক্ষে কাজ করবে না
এমটিবেনেট

2

আমি যখন আমার মডেলের জন্য একটি সম্পাদনা ভিউ তৈরি করি তখন আমার এই সমস্যাটি ছিল এবং আমি কেবল একটি ক্ষেত্র আপডেট করতে চাই।

সহজ সমাধানের জন্য আমার সমাধানটি ব্যবহার করে দুটি ক্ষেত্র স্থাপন করা হয়েছে:

 <%: Html.HiddenFor(model => model.ID) %>
 <%: Html.HiddenFor(model => model.Name)%>
 <%: Html.HiddenFor(model => model.Content)%>
 <%: Html.TextAreaFor(model => model.Comments)%>

মন্তব্যগুলি এমন ক্ষেত্র যা আমি কেবল সম্পাদনা ভিউতে আপডেট করি, যেটিতে অ্যাট্রিবিউটের প্রয়োজন হয় না।

এএসপি.নেট এমভিসি 3 সত্তা


1

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


1

@ ডারিন যা বলেছে তা হ'ল আমিও সুপারিশ করব। তবে আমি এটিতে যুক্ত করব (এবং একটি মন্তব্যের প্রতিক্রিয়ায়) যে আপনি আসলে এই পদ্ধতিটি বিট, বুল, এমনকি গাইডের মতো কাঠামোর জন্যও এটিকে ব্যবহারযোগ্য করে তুলতে পারেন them একবার আপনি এটি করেন, Requiredপ্রত্যাশার মতো বৈশিষ্ট্যগুলি কার্য করে।

public UpdateViewView
{
    [Required]
    public Guid? Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public int? Age { get; set; }
    [Required]
    public bool? IsApproved { get; set; }
    //... some other properties
}

1

এমভিসি 5 হিসাবে এটি আপনার এটিকে যোগ করে সহজেই অর্জন করা যায় global.asax

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

1

আমি এমন কোনও সমাধান খুঁজছিলাম যেখানে আমি ওয়েব এপিআইতে sertোকানো এবং আপডেট করার জন্য একই মডেলটি ব্যবহার করতে পারি। আমার পরিস্থিতিতে এটি সর্বদা শরীরের বিষয়বস্তু। [Requiered]যদি এটা একটি আপডেট পদ্ধতি বৈশিষ্ট্যাবলী এড়ানো করা আবশ্যক। আমার সমাধানে, আপনি [IgnoreRequiredValidations]পদ্ধতির উপরে একটি বৈশিষ্ট্য রাখুন । এটি নিম্নরূপ:

public class WebServiceController : ApiController
{
    [HttpPost]
    public IHttpActionResult Insert(SameModel model)
    {
        ...
    }

    [HttpPut]
    [IgnoreRequiredValidations]
    public IHttpActionResult Update(SameModel model)
    {
        ...
    }

    ...

আর কী করা দরকার? একটি নিজস্ব বডিমোডেলভালিডেটর অবশ্যই প্রারম্ভকালে বক্রযুক্ত এবং যুক্ত করা উচিত। এটি এইচটিটিপি কনফিগারেশনে রয়েছে এবং দেখতে এটির মতো দেখাচ্ছে:config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());

using Owin;
using your_namespace.Web.Http.Validation;

[assembly: OwinStartup(typeof(your_namespace.Startup))]

namespace your_namespace
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            Configuration(app, new HttpConfiguration());
        }

        public void Configuration(IAppBuilder app, HttpConfiguration config)
        {
            config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());
        }

        ...

আমার নিজস্ব বডিমোডেলভিডিয়েটর ডিফল্টবডি মডেলভালিডেটর থেকে প্রাপ্ত from এবং আমি বুঝতে পারি যে আমাকে 'শ্যালোভালিডেট' মেথোডকে ওভাররাইড করতে হয়েছিল। এই ওভাররাইডে আমি প্রয়োজনীয় মডেল ভ্যালিডিটারগুলিকে ফিল্টার করি। এবং এখন IgnoreRequiredOrDefaultBodyModelValidator ক্লাস এবং IgnoreRequiredValidations বৈশিষ্ট্য শ্রেণি:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web.Http.Controllers;
using System.Web.Http.Metadata;
using System.Web.Http.Validation;

namespace your_namespace.Web.Http.Validation
{
    public class IgnoreRequiredOrDefaultBodyModelValidator : DefaultBodyModelValidator
    {
        private static ConcurrentDictionary<HttpActionBinding, bool> _ignoreRequiredValidationByActionBindingCache;

        static IgnoreRequiredOrDefaultBodyModelValidator()
        {
            _ignoreRequiredValidationByActionBindingCache = new ConcurrentDictionary<HttpActionBinding, bool>();
        }

        protected override bool ShallowValidate(ModelMetadata metadata, BodyModelValidatorContext validationContext, object container, IEnumerable<ModelValidator> validators)
        {
            var actionContext = validationContext.ActionContext;

            if (RequiredValidationsIsIgnored(actionContext.ActionDescriptor.ActionBinding))
                validators = validators.Where(v => !v.IsRequired);          

            return base.ShallowValidate(metadata, validationContext, container, validators);
        }

        #region RequiredValidationsIsIgnored
        private bool RequiredValidationsIsIgnored(HttpActionBinding actionBinding)
        {
            bool ignore;

            if (!_ignoreRequiredValidationByActionBindingCache.TryGetValue(actionBinding, out ignore))
                _ignoreRequiredValidationByActionBindingCache.TryAdd(actionBinding, ignore = RequiredValidationsIsIgnored(actionBinding.ActionDescriptor as ReflectedHttpActionDescriptor));

            return ignore;
        }

        private bool RequiredValidationsIsIgnored(ReflectedHttpActionDescriptor actionDescriptor)
        {
            if (actionDescriptor == null)
                return false;

            return actionDescriptor.MethodInfo.GetCustomAttribute<IgnoreRequiredValidationsAttribute>(false) != null;
        } 
        #endregion
    }

    [AttributeUsage(AttributeTargets.Method, Inherited = true)]
    public class IgnoreRequiredValidationsAttribute : Attribute
    {

    }
}

সূত্র:


0

আপনি যদি অন্য ভিউমোডেলটি ব্যবহার করতে না চান তবে আপনি সেই ভিউটিতে ক্লায়েন্টের বৈধতা অক্ষম করতে পারবেন এবং সেই বৈশিষ্ট্যগুলির জন্য যা আপনি উপেক্ষা করতে চান তার জন্য সার্ভারে থাকা বৈধতাগুলিও সরাতে পারেন। আরও গভীর ব্যাখ্যার জন্য দয়া করে এই উত্তরটি দেখুন https://stackoverflow.com/a/15248790/1128216


0

আমার ক্ষেত্রে একই মডেলটি পুনরায় ব্যবহারের উদ্দেশ্যে বিভিন্ন পৃষ্ঠায় ব্যবহৃত হয়েছিল। সুতরাং আমি যা করেছি তা হ'ল আমি একটি কাস্টম অ্যাট্রিবিউট তৈরি করেছি যা ছাড়ের জন্য পরীক্ষা করে

public class ValidateAttribute : ActionFilterAttribute
{
    public string Exclude { get; set; }
    public string Base { get; set; }
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!string.IsNullOrWhiteSpace(this.Exclude))
        {
            string[] excludes = this.Exclude.Split(',');
            foreach (var exclude in excludes)
            {
                actionContext.ModelState.Remove(Base + "." + exclude);
            }
        }
        if (actionContext.ModelState.IsValid == false)
        {
            var mediaType = new MediaTypeHeaderValue("application/json");
            var error = actionContext.ModelState;

            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, error.Keys, mediaType);

        }
    }
}

এবং আপনার নিয়ামক মধ্যে

[Validate(Base= "person",Exclude ="Age,Name")]
    public async Task<IHttpActionResult> Save(User person)
    {

            //do something           

    }

বলুন মডেলটি

public class User
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Range(18,99)]
    public string Age { get; set; }
    [MaxLength(250)]
    public string Address { get; set; }
}

-1

হ্যাঁ প্রয়োজনীয় বৈশিষ্ট্যটি অক্ষম করা সম্ভব। প্রয়োজনীয় নিজস্বতা থেকে সীমাবদ্ধ করতে নিজস্ব কাস্টম শ্রেণীর বৈশিষ্ট্য (নমুনা কোডটি পরিবর্তনযোগ্য-প্রয়োজনীয়) বলে তৈরি করুন এবং একটি প্রতিবন্ধী সম্পত্তি যুক্ত করুন এবং এটি বিতরণযোগ্য কিনা তা পরীক্ষা করার জন্য ইসভিলাল পদ্ধতিতে ওভাররাইড করুন। প্রতিবন্ধী পপার্টি সেট করতে প্রতিবিম্বটি ব্যবহার করুন:

কাস্টম বৈশিষ্ট্য:

namespace System.ComponentModel.DataAnnotations
{
    public class ChangeableRequired : RequiredAttribute
    {
       public bool Disabled { get; set; }

       public override bool IsValid(object value)
       {
          if (Disabled)
          {
            return true;
          }

          return base.IsValid(value);
       }
    }
}

আপনার নতুন কাস্টম অ্যাট্রিবিউট ব্যবহার করার জন্য আপনার সম্পত্তি আপডেট করুন:

 class Forex
 {
 ....
    [ChangeableRequired]
    public decimal? ExchangeRate {get;set;}
 ....
 }

যেখানে সম্পত্তি সেট সেট করতে আপনার প্রতিচ্ছবি ব্যবহার নিষ্ক্রিয় করতে হবে:

Forex forex = new Forex();
// Get Property Descriptor from instance with the Property name
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(forex.GetType())["ExchangeRate"];
//Search for Attribute
ChangeableRequired attrib =  (ChangeableRequired)descriptor.Attributes[typeof(ChangeableRequired)];

// Set Attribute to true to Disable
attrib.Disabled = true;

এই সুন্দর এবং পরিষ্কার লাগছে?

নোট: উপরের বৈধতাটি অক্ষম করা হবে যখন আপনার অবজেক্টের উদাহরণটি জীবিত থাকবে \ সক্রিয় ...


এ সম্পর্কে কয়েকটি বিতর্কের পরে আমি উল্লেখ করতে চাই যে আমি বৈধতা অক্ষম করার প্রস্তাব দিচ্ছি না বরং নিয়মটি পর্যালোচনা করছি। যদি আপনি এটি অক্ষম করেন, আপনি নিয়মটিকে পুনরায় সক্ষম করার জন্য একটি নির্ভরতা তৈরি করুন এবং আমি বিধিটি পর্যালোচনা করার পরামর্শ দেব।
আর্নেস্ট গুনিং

একই প্রক্রিয়াটির মধ্যে সম্পাদিত ক্ষেত্রটির সমস্ত বৈধতা সম্পূর্ণরূপে অক্ষম করতে একটি স্ট্যাটিক মান পরিবর্তন করা ভয়ানক ধারণা বলে মনে হচ্ছে।
জেরেমি লেকম্যান 20'18
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.