PDA

View Full Version : سوال: اسفاده از enum و نمایش مقدار قابل خواندن به کاربر



سعید کشاورز
یک شنبه 08 بهمن 1396, 10:14 صبح
سلام دوستان..سوال اولم اینه
1) چجوری میشه enum رو تبدیل به Dropdown list کرد که مقداری که توی دیتابیس میشینه عدد باشه و مقداری که به کاربر نمایش داده میشه ( هنگام انتخاب از لیست) متن فارسی باشه؟
مثلا فرض کنید کاربر داره یه فرم پر میکنه که باید نوع دوربین های مدار بسته رو مشخص کنه.. حالا ما هم 4 تا نوع بیشتر نداریم که به صورت استاتیک هست.میخوام Value این Dropdown عدد باشه و مقداری نمایشی اون به کاربر متن فارسی باشه.

2) حالا فرض کنیم کار بالارو انجام دادیم و یه فیلد به اسم Type داخل دیتابیس داریم از نوع int که توش مثلا 1و2و3و4 ذخیره شده. چجوری میشه به جای اعداد به کاربر پیام مناسب نشون بدیم؟ من اومدم یه تابع تعریف کردم که بهش عدد میدی و با دستور سویچ میاد رشته مناسب رو بر میگردونه..حالا من اینجا اگه 1000 تا نوع داشته باشم یعنی باید هزار خط کد بنویسم؟ خب منطقی نیست این قضیه..
سوال دومم هم میتونه ربطی به سوال اول نداشته باشه..می خوام بدونم بهترین راه چیه برای سوال دوم

parvizwpf
یک شنبه 08 بهمن 1396, 10:30 صبح
چرا نوع هاتون رو توی دیتابیس تعریف نمیکنید که راحت بتونید بایندش کنید به دراپ دان؟ بنظرم این وسط enum اون هم برای 1000 تا تایپ بی معنی باشه باید نام انگلیسی و فارسی در دییتابیس براش بگیرید چون میگید ممکنه دینامیک بشه بعدها

سعید کشاورز
یک شنبه 08 بهمن 1396, 10:50 صبح
چرا نوع هاتون رو توی دیتابیس تعریف نمیکنید که راحت بتونید بایندش کنید به دراپ دان؟ بنظرم این وسط enum اون هم برای 1000 تا تایپ بی معنی باشه باید نام انگلیسی و فارسی در دییتابیس براش بگیرید چون میگید ممکنه دینامیک بشه بعدها
البته این مثالی که زدم 1000 تا ممکنه واسه این مورد حق با شما باشه نباید این مثال رو میزدم.:لبخند:
اما می خوام بدونم در کل راهش چی هست؟

RIG000
یک شنبه 08 بهمن 1396, 11:09 صبح
سلام دوستان..سوال اولم اینه
1) چجوری میشه enum رو تبدیل به Dropdown list کرد که مقداری که توی دیتابیس میشینه عدد باشه و مقداری که به کاربر نمایش داده میشه ( هنگام انتخاب از لیست) متن فارسی باشه؟
مثلا فرض کنید کاربر داره یه فرم پر میکنه که باید نوع دوربین های مدار بسته رو مشخص کنه.. حالا ما هم 4 تا نوع بیشتر نداریم که به صورت استاتیک هست.میخوام Value این Dropdown عدد باشه و مقداری نمایشی اون به کاربر متن فارسی باشه.

2) حالا فرض کنیم کار بالارو انجام دادیم و یه فیلد به اسم Type داخل دیتابیس داریم از نوع int که توش مثلا 1و2و3و4 ذخیره شده. چجوری میشه به جای اعداد به کاربر پیام مناسب نشون بدیم؟ من اومدم یه تابع تعریف کردم که بهش عدد میدی و با دستور سویچ میاد رشته مناسب رو بر میگردونه..حالا من اینجا اگه 1000 تا نوع داشته باشم یعنی باید هزار خط کد بنویسم؟ خب منطقی نیست این قضیه..
سوال دومم هم میتونه ربطی به سوال اول نداشته باشه..می خوام بدونم بهترین راه چیه برای سوال دوم
سلام
1- باید ببینید ورودی dropdown چی هست و همون شکل رو بهش بایند کنید پس نهایتا شما enum رو باید به شکلی تغییر بدید که به خودش بگیره این dropdown که با کدنویسی قابل انجام باید باشه و طبیعتا شما برای دارپ دان یا کمبو و ...text همیشه متن این کنترل ها هست و مقدار یک عدد

2- شما یک ستون در جدولی x دارید که باید یک مقدار دیگر رو نگه داره که این مقدار از یک جدول پایه که متصل به دارپ هست میاد و اون شامل حداقل دو فیلد به نام Id و Text هست و نه فقط یک Id .

نهایتا شما هم میتونید تیبل بگیرید براش و یا نگیرید مهم اینه که نهایتا اون چیزی رو کنترل خودتون میدین که نیازش هست .

RIG000
یک شنبه 08 بهمن 1396, 11:10 صبح
البته این مثالی که زدم 1000 تا ممکنه واسه این مورد حق با شما باشه نباید این مثال رو میزدم.:لبخند:
اما می خوام بدونم در کل راهش چی هست؟
شما به مقادیر استاتیک اشاره کردید پس اگر هست میتونید با Enum هندلش کنید

RIG000
یک شنبه 08 بهمن 1396, 11:13 صبح
نمیخام کد بزارم فکر میکنیم این نمونه ها رو ببینید براتون اوکی باشه (https://stackoverflow.com/questions/61953/how-do-you-bind-an-enum-to-a-dropdownlist-control-in-asp-net)

Moien Tajik
یک شنبه 08 بهمن 1396, 11:48 صبح
این مقاله احتمالا کمکتون میکنه : https://www.danylkoweb.com/Blog/5-more-c-extension-methods-for-the-stocking-plus-a-bonus-method-for-enums-LL

mr.sirwan
یک شنبه 08 بهمن 1396, 12:35 عصر
خیلی راحته، enum هاتون رو تعریف کنین و برای هر مقدار اتریبیوت display رو بذارین، مثلا به این شکل:

public enum PaymentTypes : byte
{
[Display(Name = "نقدی")]
نقدی = 1,

[Display(Name = "اینترنتی")]
اینترنتی = 2,

[Display(Name = "کارت خوان")]
کارت_خوان = 3,
}

حالا توی کلاستون یه فیلد از نوع همین enum تعریف کنین و داخل view توسط هلپری که خود mvc در اختیارمون میذاره این enum رو تبدیل به dropdownlist میکنیم:


@Html.EnumDropDownListFor(model => model.PaymentType, "-- نوع پرداخت را انتخاب کنید --", htmlAttributes: new { @class = "form-control" })

کار تمومه، همونطور که میخواین، توی دیتابیس عدد میشینه و توی ویو عنوان فارسی نمایش داده میشه

general67
یک شنبه 08 بهمن 1396, 20:28 عصر
برای لیست های داینامیک از دیتا بیس استفاده کنید.منظور از دیتا بیس هر جا که بشه مقداری رو ذخیره کرد.
برای لیست ها کوتاه از همین روشی که آقای سیروان فرمودند استفاده کنین.

اما در کل برای سایت های پویا حتما از دیتا بیس استفاده کنید.در مثالی بالا payment type ممکنه در آینده تغییر کنه.بنا به اقتضای مدیریت سایت.

hakim22
یک شنبه 08 بهمن 1396, 21:36 عصر
برای متن فارسی می توانید از Display استفاده کنید.


public enum ContestState
{
[Display(Name="جدید")]
New=0,


[Display(Name = "شروع شده")]
Started =1,


[Display(Name = "تمام شده")]
Finished =2,


[Display(Name = "حذف شده")]
Deleted = 3
}


برای اینکه به صورت Dropdown در ویو دیده بشه از Html.EnumDropDownListFor استفاده کنید.

برای اینکه بعد مقدار مربوط به هر کدام از Display هارو بدست بیارید می توانید از کد زیر استفاده کنید :

https://gist.github.com/codehaks/a9a5bf459d248d7493281824ca4929d8

وقتی Namespace رو به کد مربوطه در ویو اضافه کنید برای نمایش مقدار فارسی دستور زیر کافیه :


@Model.ContestState.DisplayName()

LostOfMind
شنبه 21 بهمن 1396, 11:59 صبح
سلام دوستان..سوال اولم اینه
1) چجوری میشه enum رو تبدیل به Dropdown list کرد که مقداری که توی دیتابیس میشینه عدد باشه و مقداری که به کاربر نمایش داده میشه ( هنگام انتخاب از لیست) متن فارسی باشه؟
مثلا فرض کنید کاربر داره یه فرم پر میکنه که باید نوع دوربین های مدار بسته رو مشخص کنه.. حالا ما هم 4 تا نوع بیشتر نداریم که به صورت استاتیک هست.میخوام Value این Dropdown عدد باشه و مقداری نمایشی اون به کاربر متن فارسی باشه.

2) حالا فرض کنیم کار بالارو انجام دادیم و یه فیلد به اسم Type داخل دیتابیس داریم از نوع int که توش مثلا 1و2و3و4 ذخیره شده. چجوری میشه به جای اعداد به کاربر پیام مناسب نشون بدیم؟ من اومدم یه تابع تعریف کردم که بهش عدد میدی و با دستور سویچ میاد رشته مناسب رو بر میگردونه..حالا من اینجا اگه 1000 تا نوع داشته باشم یعنی باید هزار خط کد بنویسم؟ خب منطقی نیست این قضیه..
سوال دومم هم میتونه ربطی به سوال اول نداشته باشه..می خوام بدونم بهترین راه چیه برای سوال دوم


اول یک enum ایجاد کنید مانند زیر


public enum ContentType
{
[Display(Name ="متن اول")]
content1 = 0,
[Display(Name ="متن دوم")]
content2 = 1,
}


این هم dropdown :



@Html.EnumDropDownListFor(model => model.contentType, new { @class = "form-control select2" })


با این کلاس می تونید مقدار displayname enum رو به کاربر نشون بدید


public static class EnumExtensions
{
/// <summary>
/// Retrieves the <see cref="DisplayAttribute.Name" /> property on the <see cref="DisplayAttribute" />
/// of the current enum value, or the enum's member name if the <see cref="DisplayAttribute" /> is not present.
/// </summary>
/// <param name="val">This enum member to get the name for.</param>
/// <returns>The <see cref="DisplayAttribute.Name" /> property on the <see cref="DisplayAttribute" /> attribute, if present.</returns>
public static string GetDisplayName(this Enum val)
{
return val.GetType()
.GetMember(val.ToString())
.FirstOrDefault()
?.GetCustomAttribute<DisplayAttribute>(false)
?.Name
?? val.ToString();
}
}


کافیه نام متد رو صدا بزنید مانند :


ContentType.content1.GetDisplayName)(