Aspnetcore: IValidatableObject.Validate تم استدعاؤه فقط إذا نجحت قواعد التحقق من الصحة المعرفة بالسمة؟

تم إنشاؤها على ١١ يناير ٢٠١٧  ·  3تعليقات  ·  مصدر: dotnet/aspnetcore

مرحبا،

لدي كائن بخاصية [Required] -decorated التي تنفذ IValidatableObject . أثناء ربط النموذج ، إذا كانت الخاصية المطلوبة خالية ، فلن يتم استدعاء طريقة الكائن Validate() مطلقًا. هل لا يُستدعى Validate() إلا إذا اجتاز التحقق المكون من سمة؟

في حالتي ، إذا أرسل أحد المستخدمين نموذجًا به أخطاء في التحقق من الصحة ، فسوف يرى أولاً رسالة حول الحقل المفقود. بعد ذلك ، بمجرد حل هذا الخطأ وإعادة إرسال النموذج ، يتم تقديمها مع قائمة إضافية من الأخطاء — هذه المرة ، تم إنتاجها بواسطة Validate() . هل هناك طريقة لتشغيل جميع عمليات التحقق من الصحة في نفس الوقت بحيث يتم تقديم قائمة بجميع _جميع الأخطاء التي تحتاج إلى انتباههم عند إرسال النموذج لأول مرة؟

شكرا،
بن

الإصدارات: ASP.Net Core 1.1.0 / .Net 4.6.1

رمز المثال

public class Import : IValidatableObject
{
  [Required]
  public IFormFile File { get; set; }

  public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { /* ... */ }
  //...
}

_ من وحدة التحكم: _

[HttpPost, ActionName("Index")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> IndexPost()
{
  var model = new ViewModels.Import();

  var bindingResult = await TryUpdateModelAsync(model, "", i => i.StartDate, i => i.EndDate, i => i.ImportTypeId, i => i.File);
  if (!bindingResult || ModelState.ValidationState != ModelValidationState.Valid) {
    return View(model);
  }

  // ...
}

إذا فشل المستخدم في ملء الحقل المطلوب ، فسترى رسالة خطأ حوله ولكن لن يرى رسائل الخطأ الأخرى التي قد تضيفها Validate ().

ال 3 كومينتر

تم إغلاق هذه المشكلة لأنه لم يتم تحديثها منذ 3 أشهر.

نأسف إذا تسبب هذا في أي إزعاج. نطلب منك إذا كنت لا تزال تواجه هذه المشكلة ، فيرجى تسجيل مشكلة جديدة بمعلومات محدثة وسنقوم بالتحقيق في الأمر.

أواجه هذا السلوك أيضًا في Asp.Net Core 2.0 ، مع مكتبة مرجعية تحتوي على استهداف IValidatableObject .Net Standard 2.0.
انها ليست حتى عن [Required] راضون التصديقات أن التصديقات مخصصة في Validate() يتم تنفيذها. بمعنى آخر ، يجب أن أنشر كائنًا إلى وحدة التحكم الخاصة بي مع جميع الحقول المطلوبة قبل الإبلاغ عن أي شيء آخر في modelstate.
يبدو أن modelstate يهتم بالمطلوب أولاً ، ثم كل شيء آخر. لم أجرب سمات التحقق القياسية الأخرى مثل [StringLength()] .

هذا حقا خطأ مزعج. لماذا اغلاقه؟

من الصعب تصميم الأشياء وإخبار الأشخاص بأن البيانات التوضيحية تعمل ثم تجد IValidatableObject.Validate يعمل كما هو مذكور أعلاه. إنها مشكلة ويجب إعادة فتحها.

في غضون ذلك ، يجب أن أتعامل مع المبرمجين الذين يعتقدون أن هذه برمجة جيدة:
قائمة عامة ثابتةValidateUpdateDates (أمر ICommand)
{
var newErrors = قائمة جديدة() ؛

        var validator = new DataAnnotationsValidator();
        var results = new List<ValidationResult>();
        var isValid = validator.TryValidate(command, out results);

        if (!(command is UpdatePromotionCommand cpc))
            return newErrors;

        newErrors.AddRange(ValidateDatesAreValidFormat(cpc));

        if (
          !string.IsNullOrEmpty(cpc.PurchasePeriodStart)
          && !string.IsNullOrEmpty(cpc.PurchasePeriodEnd)
          && DateTime.TryParse(cpc.PurchasePeriodStart, out DateTime purchasePeriodStartDate)
          && DateTime.TryParse(cpc.PurchasePeriodEnd, out DateTime purchasePeriodEndDate)
          && purchasePeriodStartDate > purchasePeriodEndDate
        )
        {
            newErrors.Add(new ECError("Purchase Period End cannot be before Purchase Period Start."));
        }

        if (
          !string.IsNullOrEmpty(cpc.ClaimPeriodStart)
          && !string.IsNullOrEmpty(cpc.ClaimPeriodEnd)
          && DateTime.TryParse(cpc.ClaimPeriodStart, out DateTime claimPeriodStartDate)
          && DateTime.TryParse(cpc.ClaimPeriodEnd, out DateTime claimPeriodEndDate)
          && claimPeriodStartDate > claimPeriodEndDate
        )
        {
            newErrors.Add(new ECError("Claim Period End cannot be before Claim Period Start."));
        }
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات