我有一个更强类型的视图,我的类Cliente
,定义如下
public partial class Cliente
{
public Cliente()
{
this.Campana = new HashSet<Campana>();
}
public short IdCliente { get; set; }
public short IdDireccion { get; set; }
public string Descripcion { get; set; }
public bool Activo { get; set; }
public virtual ICollection<Campana> Campana { get; set; }
public virtual Direccion Direccion { get; set; }
}
我想添加类Campana的元素,所以我像这样传入我的viewBag
ViewBag.Campanas = db.Campana;
现在我想知道的是,我如何制作一个lambda表达式来创建标签,以及基于类的字段。我试过了,但是没有用
@foreach (var item in ViewBag.Campanas)
{
@Html.LabelFor (modelItem => item.Descripcion)
}
这是Campana类
public partial class Campana
{
public Campana()
{
this.Servicio = new HashSet<Servicio>();
}
public short IdCampana { get; set; }
public short IdCliente { get; set; }
public string Descripcion { get; set; }
public bool Activo { get; set; }
public virtual Cliente Cliente { get; set; }
public virtual ICollection<Servicio> Servicio { get; set; }
}
现在我想知道的是,这是我如何做一个lambda表达式基于类
创建标签和字段
如果你使用ViewBag/ViewData这个垃圾,你可以完全忘记lambdas和强类型。不可能。ViewBag是动态解析,不提供任何编译时类型安全。
我建议你使用视图模型,让你的控制器动作传递特定的视图模型类型给你的视图。简单地忘记ViewBag的存在。它将使你的代码强类型和编译时安全。
网上有很多文章和教程教人们这种ViewBag
癌症。我真的受够了。请不要在你的任何应用程序中使用它。
- 定义视图模型。让你的控制器动作把那些视图模型传递给视图。
- 强类型视图(
@model MyViewModel
) - 在视图中使用带有lambda表达式和编译时安全性的强类型帮助器。
结论:只有当你完全从你的应用程序中删除任何ViewBag/ViewData的踪迹时,我们才能谈论你的视图中的lambda和强类型
你得到这个错误的原因是因为你不能在dynamic
引用上使用lambda。(即ViewBag
)现在,你说了一些关于强类型视图,但你的视图实际上不是强类型的。要做到这一点,可以使用@model
指令。你可以这样声明你的模型:
@model Table<Campana>
那么你可以用Model
代替ViewBag.Campanas
。或者,如果您愿意,也可以直接传入整个数据上下文(db
)。然而,这不是很好的做法。最好为视图创建单独的"视图模型",并将linq-to-sql对象转换为视图模型。