Почему вы хотите использовать регулярные выражения? Очень мудрый человек однажды сказал, я цитирую:
Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать
регулярные выражения. "Теперь у них есть две проблемы.
Как насчет использования атрибута [Display]
, специально разработанного для этой цели:
public enum MyProperty
{
[Display(Name = "This is some super text")]
This_is_some_text,
[Display(Name = "And this is some other text")]
This_is_some_other_text
}
, а затем написание собственного Html-помощника:
public static class HtmlExtensions
{
public static IHtmlString DisplayForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
if (!typeof(TProperty).IsEnum)
{
throw new ArgumentException("sorry this helper is inteded to be used with enum types");
}
var model = htmlHelper.ViewData.Model;
if (htmlHelper.ViewData.Model == null)
{
return MvcHtmlString.Empty;
}
var field = typeof(TProperty).GetField(expression.Compile()(htmlHelper.ViewData.Model).ToString());
if (field == null)
{
return new HtmlString(htmlHelper.Encode(htmlHelper.ViewData.Model.ToString()));
}
var display = field.GetCustomAttributes(typeof(DisplayAttribute), true).FirstOrDefault() as DisplayAttribute;
if (display == null)
{
return new HtmlString(htmlHelper.Encode(htmlHelper.ViewData.Model.ToString()));
}
return new HtmlString(htmlHelper.Encode(display.Name));
}
}
Итак, теперь предположим, что у вас есть модель вида:
public class MyViewModel
{
public MyProperty Foo { get; set; }
}
и контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Foo = MyProperty.This_is_some_other_text
};
return View(model);
}
}
вы можете использовать пользовательский помощник, который мы только что написали в представлении, для отображения удобного для пользователя текста, который мы могли бы связать с уродливым перечислением. Эй, теперь вы можете даже работать с глобализацией и несколькими языками, используя ресурсы:
@model MyViewModel
@Html.DisplayForEnum(x => x.Foo)