Целочисленное расширение в виде бритвы mvc - PullRequest
1 голос
/ 21 января 2012

Я новичок в ASP.NET MVC и методах расширения.

Я создал два расширения, которые я хочу использовать в моем представлении:

public static class Extensions
{
    public static string ToYesNo(this bool value)
    {
        return value ? "Yes" : "No";
    }

    public static string MonthToString(this int value)
    {
        return (value >= 1 && value <= 12) ? CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(value) : "";
    }
}

Я могу использовать ToYesNo с логическим значением в представлении, но не могу просмотреть MonthToString с целым числом. Я получаю:

'int' does not contain a definition for 'MonthToString'

Расширения находятся в пространстве имен BitvaerkAdmin.Models, и я ссылаюсь на это в файле cshtml.

Почему я не могу использовать мое целочисленное расширение?

Edit:

Я ссылаюсь на расширения в моем представлении следующим образом:

@using BitvaerkAdmin.Models


<h3>
    @ViewBag.Month.MonthToString()
</h3>



@foreach (Order order in ViewBag.Orders)
{
    <td>
    @order.Valid.ToYesNo()
    </td>
}

Ответы [ 2 ]

5 голосов
/ 21 января 2012

ОК, теперь, когда вы показали свой код, стало понятно, почему он не работает.Вы используете 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>

Теперь все строго напечатано и работает.

1 голос
/ 21 января 2012

После ссылки на класс Extention в My view я попытался, как показано ниже, и это сработало для меня.

    @using NameSpace Of your Extentions class;
    @{
      int i = 10;          
    }
    <span>@i.MonthToString()</span>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...