سؤال

لدي الممتلكات التالية في فئة بيانات التعريف النموذجية الخاصة بي:

[Required(ErrorMessage = "Spent On is required")]
[RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]", 
   ErrorMessage = "Please enter date in mm/dd/yyyy format")]
[DataType(DataType.Date)]
[DisplayName("Spent On")]
public DateTime SpentOn { get; set; }

لكن كلما اتصلت ModelState.IsValid إنها تُرجع دائمًا كاذبة لأن Regex لا يتحقق من التحقق منه. لقد تطابق تاريخ الإدخال (08/29/2010) مقابل Regex الجديد باستخدام نفس النمط ويتطابق تمامًا.

ما الخطأ الذي افعله؟

هل كانت مفيدة؟

المحلول

ذلك لأن Regex ينطبق على الأوتار وليس DateTime الخصائص. إذا دخل المستخدم إلى سلسلة غير صالحة لا يمكن تحليلها إلى DateTime مثيل من موثق النموذج ، سيضيف رسالة خطأ عام قبل تنفيذ نمط regex.

لديك بعض الاحتمالات:

  1. تخصيص رسالة الخطأ في ملف الموارد
  2. اكتب موثق نموذج مخصص
  3. استخدم خاصية سلسلة (أشعر بالذنب لاقتراح هذا :-))

نصائح أخرى

الفعلي هناك حل آخر لهذا الغرض. يمكنك ببساطة التصنيف الفرعي لـ regularexpressionattribute

public class DateFormatValidatorAttribute : RegularExpressionAttribute {
    public DateFormatValidatorAttribute()
        : base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]") 
        {
            ErrorMessage = "Please enter date in mm/dd/yyyy format";
        }

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

في global.asax.cs عند التطبيق ، قم بتسجيل addapter regularexpression للتحقق من صحة من جانب العميل مثل:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(DateFormatValidatorAttribute), 
                typeof(RegularExpressionAttributeAdapter));

الآن يمكنك الحصول على جانب عميل مصادقة مصلحة الإصابة ببناء MVC والحفاظ على DateTime كنوع الخاص بك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top