ОК, теперь, когда вы показали свой код, стало понятно, почему он не работает.Вы используете ViewBag
( корень всего зла в ASP.NET MVC и источник всех проблем, с которыми сталкиваются люди - небольшое дополнение от автора этого ответа).
Один разты заимствуешь его путь, падение в пропасть является выдающимся.Это падение будет ускорено приведением, которое вам нужно выполнить, чтобы заставить его работать:
@((int)(ViewBag.Month).MonthToString())
Просто попробуйте запустить следующее консольное приложение, и вы поймете, что динамические переменные нельзя использовать для отправки методов расширения:
public static class Extensions
{
public static string MonthToString(this int value)
{
return (value >= 1 && value <= 12) ? CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(value) : "";
}
}
class Program
{
static void Main()
{
dynamic foo = 123;
Console.WriteLine(foo.MonthToString()); // crash at runtime
}
}
Понимаете, почему я всегда критикую ViewBag
, когда вижу людей, использующих его?Потому что это приводит вас ко всяким странным вещам.Вы теряете Intellisense, вы не можете отправлять методы расширения для динамических переменных, ...
Так что на самом деле вам не нужно приводить.Вы вообще не должны использовать ViewBag / ViewData.Вы должны использовать строго типизированные модели представления:
@using BitvaerkAdmin.Models
@model MyViewModel
<h3>
@Model.Month.MonthToString()
</h3>
@foreach (Order order in Model.Orders)
{
<td>
@order.Valid.ToYesNo()
</td>
}
, и чтобы избежать цикла foreach, вы можете использовать шаблоны отображения:
@using BitvaerkAdmin.Models
@model MyViewModel
<h3>
@Model.Month.MonthToString()
</h3>
@Html.DisplayFor(x => x.Orders)
, а затем определить шаблон отображения для заказа, который будетавтоматически рендерится фреймворком для всех элементов коллекции (~/Views/Shared/DisplayTemplates/Order.cshtml
):
@using BitvaerkAdmin.Models
@model Order
<td>
@Model.Valid.ToYesNo()
</td>
Теперь все строго напечатано и работает.