سؤال

في عالم MVC لدي هذا نموذج عرض...

public class MyViewModel{

[Required]
public string FirstName{ get; set; }    }

و هذا النوع من شيء في وجهة نظري...

<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<%= Html.TextBox("FirstName") %>
<%= Html.ValidationMessage("FirstName", "*") %>

سؤالي:إذا أقدم هذا النموذج دون تقديم اسم أحصل على الرسالة التالية "حقل" الاسم الأول "مطلوب"

موافق.إذا ذهبت تغيير الملكية...

[DisplayName("First Name")]
[Required]
public string FirstName{ get; set; }    

..و الآن الحصول على "أول اسم الحقل مطلوب"

كل شيء جيد حتى الآن.

حتى الآن أريد رسالة الخطأ إلى عرض "الاسم الأول بلاه بلاه".كيف يمكنني تجاوز الرسالة الافتراضية لعرض DisplayName + "بلاه بلاه", توت التأشير كافة الخصائص مع شيء من هذا القبيل

[Required(ErrorMessage = "First Name Blah Blah")]

الهتافات ،

ETFairfax

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

المحلول

public class GenericRequired: RequiredAttribute
{
    public GenericRequired()
    {
        this.ErrorMessage = "{0} Blah blah"; 
    }
}

نصائح أخرى

وهنا هو طريقة للقيام بذلك دون RequiredAttribute إن شاء subclasses ترث. مجرد تقديم بعض فصول محول السمة. هنا أنا باستخدام ErrorMessageResourceType / ErrorMessageResourceName (مع مورد) ولكن هل يمكن بسهولة وضع ErrorMessage، أو حتى التحقق من وجود تجاوزات قبل إعداد هذه.

وGlobal.asax.cs:

public class MvcApplication : HttpApplication {
    protected void Application_Start() {
        // other stuff here ...
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(RequiredAttribute), typeof(CustomRequiredAttributeAdapter));
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(StringLengthAttribute), typeof(CustomStringLengthAttributeAdapter));
    }
}

private class CustomRequiredAttributeAdapter : RequiredAttributeAdapter {
    public CustomRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValRequired";
    }
}

private class CustomStringLengthAttributeAdapter : StringLengthAttributeAdapter {
    public CustomStringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValStringLength";
    }
}

وهذا المثال سيكون إنشاء ملف مورد اسمه Resources.resx مع ValRequired كرسالة الافتراضية الجديدة المطلوبة وValStringLength كما تجاوز طول السلسلة الرسالة الافتراضية. لاحظ أن لكليهما، يتلقى {0} اسم هذا المجال، والتي يمكنك تحديدها مع [Display(Name = "Field Name")].

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

وهذا هو ما فعلته، وأنه يعمل. آمل أن يساعد هذا شخص.

public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
    public CustomRequiredAttribute()
    {
        this.ErrorMessage = "whatever your error message is";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "required"
        };
    }
}

ومجرد تغيير

[Required] 

إلى

[Required(ErrorMessage = "Your Message, Bla bla bla aaa!")]

تحرير:لقد نشرت هذا لأنني كنت أبحث عن هذا الحل مع [مطلوب] السمة لديه مشكلة في العثور عليه.خلق جديد Q/A لا تبدو جيدة ، لأن هذا السؤال موجود بالفعل.

كنت أحاول حل نفس الشيء و وجدت حل بسيط جدا في MVC 4.

أولا, كنت ربما قد لتخزين رسائل خطأ في مكان ما.اعتدت مخصص الموارد وصفا جيدا في http://afana.me/post/aspnet-mvc-internationalization.aspx.

المهم هو أن أتمكن من الحصول على أي مورد (حتى رسالة خطأ) ببساطة الاتصال ResourcesProject.الموارد.SomeCustomError أو ResourcesProject.الموارد.MainPageTitle الخ.في كل مرة أحاول الوصول إلى الموارد الدرجة يستغرق ثقافة معلومات من الترابط الحالي وإرجاع حق اللغة.

لدي رسالة خطأ التحقق من صحة الحقل في ResourcesProject.الموارد.RequiredAttribute.لتعيين هذه الرسالة تظهر في الرأي ، ببساطة تحديث [مطلوب] السمة مع هذه المعلمتين.

ErrorMessageResourceType - النوع الذي أطلق عليه اسم (في مثالنا ResourcesProject.الموارد)

ErrorMessageResourceName - العقار الذي سوف يطلق على نوع أعلاه (في حالتنا RequiredAttribute)

هنا هو مبسط جدا الدخول النموذج الذي يظهر فقط اسم المستخدم التحقق من صحة الرسالة.عندما يكون الحقل فارغ ، فإنه سيتم اتخاذ سلسلة من ResourcesProject.الموارد.RequiredAttribute وعرض هذا خطأ.

    public class LoginModel
    {        
        [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName="RequiredAttribute")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

ويمكنك كتابة السمة الخاصة بك:

public class MyRequiredAttribute : ValidationAttribute
{
    MyRequiredAttribute() : base(() => "{0} blah blah blah blaaaaaah")
    {

    }

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return false;
        }
        string str = value as string;
        if (str != null)
        {
            return (str.Trim().Length != 0);
        }
        return true;
    }
}

وهذا هو نسخة من RequiredAttribute من العاكس مع رسالة الخطأ التي تم تغييرها.

using Resources;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Web;
using System.Web.Mvc;

public class CustomRequiredAttribute : RequiredAttribute,  IClientValidatable
{
    public CustomRequiredAttribute()
    {
        ErrorMessageResourceType = typeof(ValidationResource);
        ErrorMessageResourceName = "RequiredErrorMessage";
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {


        yield return new ModelClientValidationRule
        {
            ErrorMessage = GetRequiredMessage(metadata.DisplayName),
            ValidationType = "required"
        };
    }


    private string GetRequiredMessage(string displayName) {

        return displayName + " " + Resources.ValidationResource.RequiredErrorMessageClient;        

    }


}

وApp_GlobalResources / ValidationResource.resx

والآن استخدام البيانات الشرح

[CustomRequired]

وهذا عمل بالنسبة لي. قراءة بعناية التعليقات داخل رمز. (بناء على الجواب تشاد).

 // Keep the name the same as the original, it helps trigger the original javascript 
 // function for client side validation.

        public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute, IClientValidatable
            {
                public RequiredAttribute()
                {
                    this.ErrorMessage = "Message" // doesnt get called again. only once.
                }

                public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
                {
                    yield return new ModelClientValidationRule
                    {
                        ErrorMessage = "Message", // this gets called on every request, so it's contents can be dynamic.
                        ValidationType = "required"
                    };
                }
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top