Условное форматирование в представлении индекса бритвы
Я пытаюсь условно добавить background-color
CSS в набор строк таблицы, исходя из того, насколько близок дата истечения срока действия элемента. Тридцать дней или меньше должны быть красными, 90 - 31 день янтаря, а остальные зелеными. (Сначала я ставил красный, как только это работает, я вернусь и сделаю янтарные/зеленые ряды).
@foreach (var item in Model)
{
int daysLeft = (item.ExpiryDate - DateTime.Today).Days;
if (daysLeft <= 30)
{
<tr style="background-color:Red">
}
else
{
<tr>
}
<td>
@Html.DisplayFor(modelItem => item.SupplierName)
</td>
<td>
@Html.DisplayFor(modelItem => item.ExpiryDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.InceptionDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Value)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
@Html.ActionLink("Details", "Details", new { id = item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id = item.Id })
</td>
</tr>
}
Когда я запускаю эту страницу, я получаю YSOD, говорящий, что в блоке @foreach
отсутствует его закрытие }
, но насколько я вижу, они сопоставлены, поэтому я предполагаю, что фактическая проблема - это что-то другое.
Ответы
Ответ 1
Razor требует, чтобы метки непосредственно внутри кодовых блоков были сбалансированы и хорошо сформированы.
Поэтому весь код после первого открытия <tr>
фактически анализируется как разметка, так что final }
просто закрывает if
.
Чтобы исправить это, вы можете заставить Razor игнорировать тег, префикс строки с помощью @:
Кроме того, вы можете избавиться от, if
полностью и писать
string style = daysLeft <= 30 ? "background-color:Red" : null;
<tr style="@style">
...
</tr>
Ответ 2
Использовать условный оператор
bool состояние? true_expression: false_expression;
http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.80).aspx
@foreach (var item in Model)
{
int daysLeft = (item.ExpiryDate - DateTime.Today).Days;
<tr style="@(daysleft < 30 ? "Background-color:red" : "")">
.....
}