نمایش نتایج 1 تا 7 از 7

نام تاپیک: یکسان سازی حروف ی و ک در ASP.NET Core

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    بنیان گذار Barnamenevis آواتار مهدی کرامتی
    تاریخ عضویت
    اسفند 1381
    محل زندگی
    کرج، گلشهر
    سن
    48
    پست
    6,379

    نقل قول: یکسان سازی حروف ی و ک در ASP.NET Core

    چند تا راه برای این مسئله وجود داره:
    1. از طریق یک Middleware بدنه Request رو بخوانید، و کاراکترهای ی و ک عربی رو با فارسی جایگزین کنید (این روش آسان نیست، خودم تا این لحظه که این پاسخ رو می نویسم دارم رویش کار می کنم، اما هنوز به نتیجه نرسیدم).
    2. یک Model Binder برای نوع داده String بنویسید، و در اون Model Binder کاراکترهای مورد نظر را با معادل هاش جایگزین کنید (پروسه اش کمی سخته، ولی انجامش دادم، اگر میخواهی بگو کدش رو بگذارم).
    3. از طریق مکانیسمی مثل نوشتن فیلتر برای EF Core کار مورد نظر رو انجام دهید (هنوز این روش رو بررسی نکردم که شدنی هست یا نه، نمونه کدش برای EF 6 دیدم).


    اگر روش 2 به کارت میاد اعلام کن. مزیت روش 2 این است که روی داده های دریافتی از تمام منابع، از جمله Form و Query String و Route Parameter تاثیر میگذاره، اما روی داده های خوانده شده از دیتابیس، یا مثلا یک فایل Text و ... تاثیری نداره.

  2. #2
    کاربر دائمی آواتار hamzehsh
    تاریخ عضویت
    مرداد 1385
    محل زندگی
    https://samanhis.ir
    سن
    43
    پست
    166

    نقل قول: یکسان سازی حروف ی و ک در ASP.NET Core

    من اینطوری مشکل رو حل کردم
    متد savechange رو overrid کردم



    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
    ApplyCorrectYeKe();
    return (await base.SaveChangesAsync(true, cancellationToken));
    }




    private void ApplyCorrectYeKe()
    {
    //پیدا کردن موجودیت‌های تغییر کرده
    var changedEntities = this.ChangeTracker
    .Entries()
    .Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);


    foreach (var item in changedEntities)
    {
    if (item.Entity == null) continue;


    //یافتن خواص قابل تنظیم و رشته‌ای این موجودیت‌ها
    var propertyInfos = item.Entity.GetType().GetProperties(
    BindingFlags.Public | BindingFlags.Instance
    ).Where(p => p.CanRead && p.CanWrite && p.PropertyType == typeof(string));


    //var pr = new PropertyReflector();
    var pr = new PropertyReflector();


    //اعمال یکپارچگی نهایی
    foreach (var propertyInfo in propertyInfos)
    {
    var propName = propertyInfo.Name;
    var val = pr.GetValue(item.Entity, propName);
    if (val != null)
    {
    var newVal = val.ToString().Replace("ي", "ی").Replace("ك", "ک").Trim();
    if (newVal == val.ToString()) continue;
    pr.SetValue(item.Entity, propName, newVal);
    }
    }
    }
    }


  3. #3
    بنیان گذار Barnamenevis آواتار مهدی کرامتی
    تاریخ عضویت
    اسفند 1381
    محل زندگی
    کرج، گلشهر
    سن
    48
    پست
    6,379

    نقل قول: یکسان سازی حروف ی و ک در ASP.NET Core

    نقل قول نوشته شده توسط hamzehsh مشاهده تاپیک
    من اینطوری مشکل رو حل کردم
    متد savechange رو overrid کردم



    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
    ApplyCorrectYeKe();
    return (await base.SaveChangesAsync(true, cancellationToken));
    }




    private void ApplyCorrectYeKe()
    {
    //پیدا کردن موجودیت‌های تغییر کرده
    var changedEntities = this.ChangeTracker
    .Entries()
    .Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);


    foreach (var item in changedEntities)
    {
    if (item.Entity == null) continue;


    //یافتن خواص قابل تنظیم و رشته‌ای این موجودیت‌ها
    var propertyInfos = item.Entity.GetType().GetProperties(
    BindingFlags.Public | BindingFlags.Instance
    ).Where(p => p.CanRead && p.CanWrite && p.PropertyType == typeof(string));


    //var pr = new PropertyReflector();
    var pr = new PropertyReflector();


    //اعمال یکپارچگی نهایی
    foreach (var propertyInfo in propertyInfos)
    {
    var propName = propertyInfo.Name;
    var val = pr.GetValue(item.Entity, propName);
    if (val != null)
    {
    var newVal = val.ToString().Replace("ي", "ی").Replace("ك", "ک").Trim();
    if (newVal == val.ToString()) continue;
    pr.SetValue(item.Entity, propName, newVal);
    }
    }
    }
    }

    توضیح درباره روش جناب حمزه:
    متد override شده SaveChangesAsync ایشان میبایست به همین شکل در کلاس DbContext پروژه اضافه شود.

    من هم یک کمی دستکاری اش کردم و کد ایشان را به این شکل به یک Extension Method تبدیل کردم:
    public static class EfExtensions
    {
    public static DbContext FixArabicYeKaf(this DbContext db)
    {
    //پیدا کردن موجودیت‌های تغییر کرده
    var changedEntities = db.ChangeTracker
    .Entries()
    .Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);


    foreach (var item in changedEntities)
    {
    if (item.Entity == null) continue;


    //یافتن خواص قابل تنظیم و رشته‌ای این موجودیت‌ها
    var propertyInfos = item.Entity.GetType().GetProperties(
    BindingFlags.Public | BindingFlags.Instance
    ).Where(p => p.CanRead && p.CanWrite && p.PropertyType == typeof(string));


    //var pr = new PropertyReflector();
    //var pr = new PropertyReflector();


    //اعمال یکپارچگی نهایی
    foreach (var propertyInfo in propertyInfos)
    {
    var propName = propertyInfo.Name;
    var val = propertyInfo.GetValue(item.Entity);
    if (val != null)
    {
    var newVal = val.ToString().Replace("ي", "ی").Replace("ك", "ک").Trim();
    if (newVal == val.ToString()) continue;
    propertyInfo.SetValue(item.Entity, newVal);
    }
    }
    }

    return db;
    }
    }

    برای فراخوانی اش هم متد override شده SaveChangeAsync رو به این شکل تغییر دادم:
    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
    this.FixArabicYeKaf();
    return (await base.SaveChangesAsync(true, cancellationToken));
    }

  4. #4
    کاربر دائمی آواتار hamzehsh
    تاریخ عضویت
    مرداد 1385
    محل زندگی
    https://samanhis.ir
    سن
    43
    پست
    166

    نقل قول: یکسان سازی حروف ی و ک در ASP.NET Core

    ممنونم استاد کرامتی عزیز

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •