handle lambda for @HTML.Label



我有一个更强类型的视图,我的类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癌症。我真的受够了。请不要在你的任何应用程序中使用它。

    定义视图模型。让你的控制器动作把那些视图模型传递给视图。
  1. 强类型视图(@model MyViewModel)
  2. 在视图中使用带有lambda表达式和编译时安全性的强类型帮助器。

结论:只有当你完全从你的应用程序中删除任何ViewBag/ViewData的踪迹时,我们才能谈论你的视图中的lambda和强类型

你得到这个错误的原因是因为你不能在dynamic引用上使用lambda。(即ViewBag)现在,你说了一些关于强类型视图,但你的视图实际上不是强类型的。要做到这一点,可以使用@model指令。你可以这样声明你的模型:

@model Table<Campana>

那么你可以用Model代替ViewBag.Campanas。或者,如果您愿意,也可以直接传入整个数据上下文(db)。然而,这不是很好的做法。最好为视图创建单独的"视图模型",并将linq-to-sql对象转换为视图模型。

最新更新