Несколько операторов if в атрибуте html — MVC razor

#asp.net-mvc-3 #razor

#asp.net-mvc-3 #razor

Вопрос:

Если бы я хотел несколько операторов if в атрибуте html, я мог бы сделать что-то вроде этого:

   <input type="button" value="Bad, the title has a lot of excess spacing" title="@if(SomeModel.condOne) {
                              <text>this</text>
                              }
                              @if (SomeModel.CondTwo)
                              {
                              <text> is</text>
                              }
                              @if (SomeModel.CondThree)
                              {
                              <text> a title</text>
                              }      
                             " />
  

Но это создает много пустых пространств, которые нуждаются в усечении. Итак, это работает:

   <input type="button" value="Good, the title is condenced" title="@if(SomeModel.condOne) {<text>this</text>}@if (SomeModel.CondTwo){<text> is</text>}@if (SomeModel.CondThree){<text> a title</text>}" />
  

Тот же принцип может быть применен к элементу с несколькими классами (например, class=»oddrow class1″ -> class=»evenrow class2″)

Но это может быть трудно прочитать, если это длинная строка. И Visual Studio имеет привычку разбивать это утверждение на несколько строк, если вы касаетесь скобки или Ctrl-K, Ctrl-D (что, вероятно, сделает любой следующий разработчик).

Есть ли лучший или более надежный способ реализовать несколько условий атрибута в строке для MVC razor?

Ответ №1:

Я предлагаю создать метод небольших помощников, который возвращает нужный вам текст.

Вам нужно будет передать его SomeModel и внутри этого метода проверить ваше состояние, чтобы у вас было что-то более приятное для просмотра и более простое в обслуживании.

Например:

 public static class HtmlHelpers
{
    public static string FetchTitle(this HtmlHelper helper, SomeModel model)
    {
        //Your logic here.
    }
}
  

Вы можете прочитать все о вспомогательных методах Html здесь, в блоге Джона Галлоуэя.

Вот где я узнал, как их использовать.

Ответ №2:

Почему бы просто не сделать это как:

 title="@if(SomeModel.condOne) { <text>this</text> }
       @if (SomeModel.CondTwo) { <text> is</text> }
       @if (SomeModel.CondThree) { <text> a title</text> }      
                             " />
  

Помощник имеет смысл, если вы часто используете ту же логику, особенно если предполагаете ту же модель, но вы можете также рассмотреть помощник, который использует Func<> выражение или Action<> выражение. Таким образом, он не будет привязан к одной модели.