2012-01-21 3 views
1

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

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

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 с BOOL в представлении, но я не могу просматривать 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> 
} 
+0

Не могли бы вы показать нам, как вы пытаетесь вызвать метод расширения в представлении? –

+1

Вы перекомпилировали проект, верно? :) – alexn

+0

@alexn, это хороший момент. Я думаю, вы прибили его :-) Это единственное возможное объяснение, о котором я могу думать сейчас, и это имеет смысл. +1. –

ответ

5

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

и избежать цикла Еогеаспа вы можете использовать шаблоны отображения:

@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> 

все теперь сильно типизированных и работает.

+0

Хорошо ... спасибо. Мне нужно посмотреть в моделях просмотра – SimonHL

1

Дав ссылку класса Удлинитель на мой взгляд, я пытался, как показано ниже, и она работала для меня.

@using NameSpace Of your Extentions class; 
    @{ 
     int i = 10;   
    } 
    <span>@i.MonthToString()</span> 
+0

Хорошо, это работает для меня, если я делаю то же самое, однако, при использовании расширения на int в моем ViewBag, я получаю исключение? – SimonHL

+0

Свойства Viewbag являются динамическими, поэтому вам нужно сначала их добавить в int, а затем вы можете позвонить по своему расширению. –

Смежные вопросы