#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<>
выражение. Таким образом, он не будет привязан к одной модели.