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