استفاده از TempData و نمایش فارسی Enum در DotnetCore 3

خوب دوستان برای استفاده از TempData ابتدا باید تنظیمات را درست کنید. برای این کار در فایل Startup در سرویس mvc یا razorpage باید کد زیر را به بخش ConfigureServices اضافه کنیمservices.AddRazorPages().AddSessionStateTempDataProvider(); services.AddSession();بطور پیشفرض tempdata با کوکی کار میکند با کد بالا ما گفتیم با سشن کار کند و سرویس سشن هم اضافه کردیم.هم چنین در بخش Configure نیز کد زیر را بعد از app.UseStaticFiles(); اضافه میکنیم: app.UseSession();خوب تنظیمات تموم شد حالا نوبت به استفاده می رسد ، چون من از razor pages استفاده میکنم این بخش برای اون مینویسم.اگر در مدل page شما پراپرتی داشته باشید که بخواهید در TempData قرار بدید کافیه صفت [TempData] بالا سرش قرار بدین و هرچی خواستید داخلش قرار بدین (البته غیر از complex types ها ! البته در ادامه راه حل هم میگم) .public class IndexModel : PageModel { [TempData] public string FormResult { get; set; } [BindProperty] public string EmailAddress { get; set; } // ...حالا برای استفاده در یک Page دیگر کافیه همان پراپرتی را با همان صفت قرار بدهیم:public class SuccessPageModel : PageModel { [TempData] public string FormResult { get; set; } ... }استفاده در view به صورت ساده :<h4>@Model.FormResult</h4>همین ! همچنین از روش های قبلی نیز می توانید استفاده کنید. و اما انتقال Complex Type ها !اگر یک complex type بخواهید منتقل کنید با خطایی زیر روبرو میشوید:The '[name of the property]' property with TempDataAttribute is invalid. The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type '[name of the property]'.برای رفع این مشکل باید ExtensionMethod زیر را بسازیم:public static class TempDataExtensions { public static void Set<T>(this ITempDataDictionary tempData, string key, T value) where T : class { tempData[key] = JsonConvert.SerializeObject(value); } public static T Get<T>(this ITempDataDictionary tempData, string key) where T : class { tempData.TryGetValue(key, out object o); return o == null ? null : JsonConvert.DeserializeObject<T>((string)o); } }نحوه set کردن و فراخوانی آن هم به این صورت هست:var contact = new Contact { FirstName = &quotArman&quot, Phone = 206405207 }; TempData.Set(&quotArman&quot, contact); var arman = TempData.Get<Contact>(&quotArman&quot);می توانید BindProperty و TempData در یک صفت بیاورید:[BindProperty, TempData] public string Foo { get; set; }نکته بسیار مهم اینکه اگر بخواهید در PostHandler از TempData استفاده کنید باید به روش قدیم استفاده کنید. یعنی TempData در صفت بکار نبرید . بجاش از روش قدیمی استفاده کنید:[BindProperty] public string Foo { get; set; } public void OnPost() { TempData[&quotFoo&quot] = foo; }و اگر هم complex type میخواهید که مانند قبل که گفته شد:[BindProperty] public string Foo { get; set; } public void OnPost() { TempData.Set(&quotnewOrder&quot, Order); }پس اگر میخواهید در مطلب قبل یک مدل را به یک Page دیگر منتقل کنید باید از ExtensionMethod که برای complex type نوشتیم استفاده کنیم.نمایش Enum فارسی هم فقط کافیه از ExtensionMethod زیر استفاده کنیم: public static class EnumExtension { public static string GetEnumDisplayName(this Enum enumType) { return enumType.GetType().GetMember(enumType.ToString()) .First() .GetCustomAttribute<DisplayAttribute>() .Name; } }و فقط کافه بالای Enum ها از صفت Display(Name="") استفاده شود: public enum LanguageType { [Display(Name=&quotهیچ کدام&quot)] None, [Display(Name = &quotفارسی&quot)] Farsi, [Display(Name = &quotانگلیسی&quot)] English }و نحوه استفاده :<label>زبان:</label> <p>@newOrder.LanguageType.GetEnumDisplayName()</p>البته اگر از TagHelper استفاده میکنید و می خواهید item ها را به صورت dropList در تگ select قرار بدین نیازی به استفاده از ExtensionMethod نیست و همون صفت کفایت میکند.بخشی از منبع