یکدست کردن «ی» و «ک» در ASP.NET Core با پیادهسازی یک Model Binder سفارشی
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۱۱/۱۶ ۱۷:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class CustomStringModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context.Metadata.IsComplexType)
{
return null;
}
var fallbackBinder = new SimpleTypeModelBinder(context.Metadata.ModelType);
if (context.Metadata.ModelType == typeof(string))
{
return new CustomStringModelBinder(fallbackBinder);
}
return fallbackBinder;
}
} public class CustomStringModelBinder : IModelBinder
{
private readonly IModelBinder _fallbackBinder;
public CustomStringModelBinder(IModelBinder fallbackBinder)
{
if (fallbackBinder == null)
{
throw new ArgumentNullException(nameof(fallbackBinder));
}
_fallbackBinder = fallbackBinder;
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueProviderResult != ValueProviderResult.None)
{
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);
var valueAsString = valueProviderResult.FirstValue;
if (string.IsNullOrWhiteSpace(valueAsString))
{
return _fallbackBinder.BindModelAsync(bindingContext);
}
var model = valueAsString.Replace((char)1610, (char)1740).Replace((char)1603, (char)1705);
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
return _fallbackBinder.BindModelAsync(bindingContext);
}
} public static class CustomStringModelBinderExtensions
{
public static MvcOptions UseCustomStringModelBinder(this MvcOptions options)
{
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
var simpleTypeModelBinder = options.ModelBinderProviders.FirstOrDefault(x => x.GetType() == typeof(SimpleTypeModelBinderProvider));
if (simpleTypeModelBinder == null)
{
return options;
}
var simpleTypeModelBinderIndex = options.ModelBinderProviders.IndexOf(simpleTypeModelBinder);
options.ModelBinderProviders.Insert(simpleTypeModelBinderIndex, new CustomStringModelBinderProvider());
return options;
}
} public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.UseCustomStringModelBinder();
}); public IActionResult Index([FromBody] MyViewModel model)
{ contentType: 'application/x-www-form-urlencoded; charset=utf-8'
public IActionResult Create([FromBody] CreateViewModel vm)
{ [ModelBinder(BinderType = typeof(PersianDateModelBinder))]
public partial class CreateViewModel
{
public int Id { get; set; }
[DisplayName("عنوان مطلب")]
public string Title { get; set; }
[DisplayName("نگارش مطلب")]
public string Content { get; set; }
[DisplayName("تاریخ درج")]
public DateTime CreateDate { get; set; } = DateTime.Now.Date;
[DisplayName("تاریخ انتشار")]
public DateTime PublishDate { get; set; } = DateTime.Now.Date;
} <form asp-action="Create" Method="post" enctype="application/x-www-form-urlencoded">
[ModelBinder(BinderType = typeof(PersianDateModelBinder))]
public class MyViewModel
{ PM> Install-Package DNTCommon.Web.Core
public static string funConvertToStandard(string inputString)
{
//تبدیل اعداد فارسی به انگلیسی جهت ذخیره سازی یکنواخت در بانک
inputString = inputString.Replace("٠", "0");
inputString = inputString.Replace("١", "1");
inputString = inputString.Replace("٢", "2");
inputString = inputString.Replace("٣", "3");
inputString = inputString.Replace("۴", "4");
inputString = inputString.Replace("۵", "5");
inputString = inputString.Replace("۶", "6");
inputString = inputString.Replace("٧", "7");
inputString = inputString.Replace("٨", "8");
inputString = inputString.Replace("٩", "9");
//تبدیل ی و ک عربی بهی و ک فارسی
inputString = inputString.Replace((char)1609, (char)1740);
inputString = inputString.Replace((char)1610, (char)1740);
inputString = inputString.Replace((char)1603, (char)1705);
//یکنواخت سازی نیم فاصله
//inputString = inputString.Replace("", "");//تبدیل نیم فاصله 8207 به نیم فاصله 8204
return inputString.Trim();
}