mvc razor视图中的整数扩展

Sim*_*nHL 1 c# asp.net-mvc integer razor

我是ASP.NET MVC和Extension方法的新手.

我创建了两个我希望在我的视图中使用的扩展:

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) : "";
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在视图中使用带有bool的ToYesNo,但我无法使用整数查看MonthToString.我明白了:

'int' does not contain a definition for 'MonthToString'
Run Code Online (Sandbox Code Playgroud)

扩展名在名为BitvaerkAdmin.Models的名称空间中,我在cshtml文件中引用它.

为什么我不能使用我的整数扩展名?

编辑:

我在我的视图中引用扩展名,如下所示:

@using BitvaerkAdmin.Models


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



@foreach (Order order in ViewBag.Orders)
{
    <td>
    @order.Valid.ToYesNo()
    </td>
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

好了,既然您已经显示了代码,那么很清楚它为什么不起作用.你使用ViewBag(ASP.NET MVC中所有邪恶的根源以及人们遇到的所有问题的根源 - 这个答案的作者很少添加).

一旦你借用它的道路,深渊的下降是显而易见的.为了使其工作,您需要执行的演员表将加速今年秋季:

@((int)(ViewBag.Month).MonthToString())
Run Code Online (Sandbox Code Playgroud)

只需尝试运行以下控制台应用程序,您就会明白动态变量不能用于调度扩展方法:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
}
Run Code Online (Sandbox Code Playgroud)

并且要避免使用foreach循环,您可以使用显示模板:

@using BitvaerkAdmin.Models
@model MyViewModel

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

@Html.DisplayFor(x => x.Orders)
Run Code Online (Sandbox Code Playgroud)

然后为订单定义一个显示模板,该模板将由框架自动呈现为collection(~/Views/Shared/DisplayTemplates/Order.cshtml)的所有元素:

@using BitvaerkAdmin.Models
@model Order
<td>
    @Model.Valid.ToYesNo()
</td>
Run Code Online (Sandbox Code Playgroud)

现在一切都是强力打字和工作.