mvc剃刀视图中的整数扩展

本文关键字:整数 扩展 剃刀 视图 mvc | 更新日期: 2023-09-27 18:20:55

我对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) : "";
    }
}

我可以在视图中将ToYesNo与bool一起使用,但我不能使用整数来查看MonthToString。我得到:

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

扩展位于名为BitvaerkAdmin.Models的命名空间中,我在cshtml文件中引用了它。

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

编辑:

在我看来,我引用的扩展如下:

@using BitvaerkAdmin.Models

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

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

mvc剃刀视图中的整数扩展

好吧,既然已经展示了代码,那么它不起作用的原因就清楚了。您使用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>

现在所有的东西都是强类型的并且可以工作。

在我的视图中引用了Extetion类之后,我尝试了以下操作,它对我有效。

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