2012-02-20 3 views
2

Я использую MVC 3 с Razor. Я не могу понять, как код расширения строки регулярное выражение, чтобы принять это:Как создать регулярное выражение для удаления подчеркивания

This_is_some_text

на дисплее:

Это некоторый текст

I настройте некоторые перечисления для выпадающего списка, поэтому они отображаются таким образом (очевидно, я не могу создать перечисление с пробелом):

public enum MyProperty 
{ 
    This_is_some_text, 
    This_is_some_other_text 
} 

Я просто не могу понять, регулярное выражение будет делать то, что я хочу, если я делаю это: «»

public static string EnumToDisplay(this string str) 
     { 
      return Regex.Replace(str, "[What is the regex I should use?]"); 
     } 

В качестве бонуса для меня Я хотел бы также добавить период до конца перечисления. Причина этого в том, что у меня OCD, и мои перечисления принимают форму коротких предложений. :)

Спасибо!

ответ

2

Почему вы хотите использовать регулярные выражения? Очень мудрый человек однажды сказал, цитирую:

Некоторые люди, сталкиваясь с проблемой, думаю, «Я знаю, я буду использовать регулярные выражения.» Теперь у них есть две проблемы.

Как об использовании атрибута [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) 
+0

Мой ответ - быстрый и грязный метод, но это, безусловно, правильное решение. Если вы пойдете с этим, вы можете легко добавить и другие не-альфа-символы, например, parens или apostrophes. –

+0

Это невероятно! Благодарю. Приступая к реализации, тогда отметьте, если необходимо. –

+0

Это было отличное решение. И предложение о работе с глобализацией! +++++ –

3

Почему бы не использовать String.Replace() для этого? RegEx кажется немного излишним.

public static string EnumToDisplay(this string str) 
{ 
    return str.Replace('_', ' ') + "."; 
} 
1

Я не знаю, о asp.net - но должна быть очень простым методом, который заменяет один символ с другим символом. Например:

String.replace(myString, '_',' '); 
Смежные вопросы