asp.net-mvc - مستقبل - مواقع asp net




ASP.NET MVC-رسالة التحقق من صحة مخصصة لأنواع القيمة (5)

ابحث عن ModelState.AddError .

عند استخدام UpdateModel أو TryUpdateModel ، يكون إطار MVC ذكيًا بما يكفي لمعرفة ما إذا كنت تحاول المرور في قيمة خالية (على سبيل المثال نسي المستخدم لملء حقل يوم الميلاد المطلوب).

للأسف ، لا أعرف كيفية تجاوز الرسالة الافتراضية ، "القيمة مطلوبة." في الملخص إلى شيء أكثر فائدة ("الرجاء إدخال يوم ميلادك").

يجب أن تكون هناك طريقة للقيام بذلك (بدون كتابة الكثير من التعليمات البرمجية) ، لكن لا يمكنني العثور عليها. أي مساعدة؟

تصحيح

وأعتقد أيضًا أن هذه ستكون أيضًا مشكلة للتحويلات غير الصالحة ، على سبيل المثال BirthDay = "Hello".


في ASP.NET MVC 1 ، قابلت هذه المشكلة أيضًا.

في مشروعي ، هناك نموذج أو عنصر أعمال اسمه "Entry" ، ومفتاحه الأساسي EntryId int؟ الكتابة ، ويمكن السماح لقيمة EntryId بإدخالها من قبل المستخدمين.

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

عند تتبع رسالة الخطأ في ModelState ، وجدت عندما تكون القيمة غير صحيحة ، سيكون هناك خطأان متعلقان بـ EntryId ، وتكون رسالة الخطأ الخاصة بالعنصر الأول فارغة ...

الآن لا بد لي من استخدام هذا الرمز القبيح لاختراق المشكلة.

if (ModelState["EntryId"].Errors.Count > 1)
{
    ModelState["EntryId"].Errors.Clear(); //should not use ModelState["EntryId"].remove();
    ModelState.AddModelError("EntryId", "必须为大于0的整数"); //必须为大于0的整数 means "it should be an integer value and great than 0"
}  

ولكن هذا يجعل الدهون تحكم ، ونأمل أن يكون هناك حل حقيقي لحلها.


لقد تم استخدام إطار التحقق من صحة xVal رائع. فإنه يتيح لي القيام بكل ما عندي من صحة المصادقة في النموذج (حتى LINQ-SQL :)). كما أنه يُصدر javascript المطلوب للتحقق من جانب العميل.

تحرير: عذراً ترك link عن كيفية الحصول عليه يعمل لـ LINQ-SQL

سير العمل الأساسي يذهب شيء من هذا القبيل.

public partial class YourClass
{
    [Required(ErrorMessage = "Property is required.")]
    [StringLength(200)]
    public string SomeProperty{ get; set; }
}
try
{
    // Validate the instance of your object
    var obj = new YourClass() { SomeProperty = "" }
    var errors = DataAnnotationsValidationRunner.GetErrors(obj);
    // Do some more stuff e.g. Insert into database
}
catch (RulesException ex)
{
    // e.g. control name 'Prefix.Title'
    ex.AddModelStateErrors(ModelState, "Prefix");   
    ModelState.SetModelValue("Prefix.Title", new ValueProviderResult(ValueProvider["Prefix.Title"].AttemptedValue, collection["Prefix.Title"], System.Globalization.CultureInfo.CurrentCulture));

}

مع DefaultModelBinder من الممكن تجاوز رسالة الخطأ المطلوبة الافتراضية ولكن لسوء الحظ أنها تنطبق على الصعيد العالمي الذي يجعل IMHO عديمة الفائدة تماما. ولكن في حال قررت أن تفعل ذلك ، فإليك الطريقة:

  1. إضافة المجلد App_GlobalResources إلى موقع ASP.NET الخاص بك
  2. إضافة ملف موارد يسمى Messages.resx
  3. داخل ملف الموارد إعلان مورد سلسلة جديدة مع المفتاح PropertyValueRequired وبعض القيمة
  4. في Application_Start قم بإضافة السطر التالي:

    DefaultModelBinder.ResourceClassKey = "Messages";
    

كما ترى ، لا يوجد رابط بين خاصية الطراز التي تقوم بالتحقق منها ورسالة الخطأ.

في الختام من الأفضل لكتابة منطق التحقق المخصص لمعالجة هذا السيناريو. تتمثل إحدى الطرق في استخدام نوع nullable (System.Nullable <TValueType>) ، ثم:

if (model.MyProperty == null || 
    /** Haven't tested if this condition is necessary **/ 
    !model.MyProperty.HasValue)
{
    ModelState.AddModelError("MyProperty", "MyProperty is required");
}

وماذا عن هذا؟

[RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$",
                   ErrorMessage = "Characters are not allowed.")]

سيسمح لك ذلك بوضع علامات على خصائص تحتوي على رسائل خطأ محددة لأي مدقق MVC تريد استخدامه ...







validation