สำหรับฉันดูเหมือนว่า ASP.NET Core MVC จะไม่รองรับ DataAnnotationsModelValidatorProvider.RegisterAdapter
อีกต่อไป วิธีแก้ปัญหาที่ฉันค้นพบมีดังนี้:
สมมติว่าฉันต้องการเปลี่ยน Validator สำหรับ RequiredAttribute
เป็นอะแดปเตอร์ตรวจสอบความถูกต้องของฉันเอง (MyRequiredAttributeAdaptor
) เปลี่ยนข้อความแสดงข้อผิดพลาดเริ่มต้นที่ EmailAddressAttribute
และเปลี่ยนแหล่งที่มาของข้อความแสดงข้อผิดพลาดที่แปลเป็นภาษาท้องถิ่นสำหรับ 'CompareAttribute' เป็นข้อความของฉันเอง
1- สร้าง ValidationAttributeAdapterProvider แบบกำหนดเอง
using Microsoft.AspNetCore.Mvc.DataAnnotations;
using Microsoft.AspNetCore.Mvc.DataAnnotations.Internal;
using Microsoft.Extensions.Localization;
using System.ComponentModel.DataAnnotations;
public class CustomValidationAttributeAdapterProvider
: ValidationAttributeAdapterProvider, IValidationAttributeAdapterProvider
{
public CustomValidationAttributeAdapterProvider() { }
IAttributeAdapter IValidationAttributeAdapterProvider.GetAttributeAdapter(
ValidationAttribute attribute,
IStringLocalizer stringLocalizer)
{
IAttributeAdapter adapter;
if (attribute is RequiredAttribute)
{
adapter = new MyRequiredAttributeAdaptor((RequiredAttribute) attribute, stringLocalizer);
}
else if (attribute is EmailAddressAttribute)
{
attribute.ErrorMessage = "Invalid Email Address.";
adapter = base.GetAttributeAdapter(attribute, stringLocalizer);
}
else if (attribute is CompareAttribute)
{
attribute.ErrorMessageResourceName = "InvalidCompare";
attribute.ErrorMessageResourceType = typeof(Resources.ValidationMessages);
var theNewattribute = attribute as CompareAttribute;
adapter = new CompareAttributeAdapter(theNewattribute, stringLocalizer);
}
else
{
adapter = base.GetAttributeAdapter(attribute, stringLocalizer);
}
return adapter;
}
}
2- เพิ่ม CustomValidationAttributeAdapterProvider เพื่อเริ่มต้น:
เพิ่มบรรทัดต่อไปนี้ใน public void ConfigureServices(IServiceCollection services)
ใน Startup.cs:
services.AddSingleton <IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider> ();
นี่คืออะแดปเตอร์ MyRequiredAttributeAdaptor:
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Microsoft.Extensions.Localization;
using Microsoft.AspNetCore.Mvc.DataAnnotations.Internal;
public class MyRequiredAttributeAdaptor : AttributeAdapterBase<RequiredAttribute>
{
public MyRequiredAttributeAdaptor(RequiredAttribute attribute, IStringLocalizer stringLocalizer)
: base(attribute, stringLocalizer)
{
}
public override void AddValidation(ClientModelValidationContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
MergeAttribute(context.Attributes, "data-val", "true");
MergeAttribute(context.Attributes, "data-val-required", GetErrorMessage(context));
}
/// <inheritdoc />
public override string GetErrorMessage(ModelValidationContextBase validationContext)
{
if (validationContext == null)
{
throw new ArgumentNullException(nameof(validationContext));
}
return GetErrorMessage(validationContext.ModelMetadata, validationContext.ModelMetadata.GetDisplayName());
}
}
ข้อมูลอ้างอิง:
1- ดูตัวอย่างของ Microsoft: โครงการเอนโทรปี: นี่คือตัวอย่างที่ยอดเยี่ยมสำหรับคุณสมบัติต่างๆ ของ .NET Core ในคำถามนี้: ดูการใช้งาน MinLengthSixAttribute
ในตัวอย่าง Mvc.LocalizationSample.Web:
https://github.com/aspnet/Entropy/tree/master/samples/Mvc.LocalizationSample.Web
2- หากต้องการดูวิธีการทำงานของอะแดปเตอร์แอตทริบิวต์ โปรดดูที่ asp.Microsoft.AspNetCore.Mvc.DataAnnotations บน github:
https://github.com/aspnet/Mvc/tree/master/src/Microsoft.AspNetCore.Mvc.DataAnnotations
person
Amir
schedule
15.11.2016