为@ HTML.Label处理lambda

时间:2011-11-28 22:15:25

标签: c# asp.net-mvc-3 razor

我有一个名为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; }
}

2 个答案:

答案 0 :(得分:3)

  

现在我想知道的是,我怎么能做一个lambda表达式   根据类

创建标签和字段

如果使用ViewBag / ViewData的这个废话,你可以完全忘记lambdas和强类型。不是机会。 ViewBag是动态分辨率,不提供任何编译时类型安全性。

我建议您使用视图模型并让控制器操作将特定视图模型类型传递给您的视图。简单地忘记ViewBag的存在。它将使您的代码强类型化并且编译时安全。

有很多文章和教程通过www教导人们ViewBag的癌症。我真的很厌烦它。请不要在任何应用程序中使用它。

  1. 定义视图模型。
  2. 让控制器操作将这些视图模型传递给视图。
  3. 强烈输入您的观点(@model MyViewModel
  4. 使用带有lambda表达式的强类型助手,并在视图中编译时间安全。
  5. 结论:只有在您从应用程序中完全删除了ViewBag / ViewData的任何痕迹之后,我们才能在您的视图中讨论lambda和强类型。

答案 1 :(得分:1)

您收到该错误的原因是您无法在dynamic引用上使用lambdas。 (即ViewBag)现在,您已经说过强类型视图,但您的视图实际上并不是强类型的。为此,请使用@model指令。您可以声明您的模型:

@model Table<Campana>

然后,您可以使用ViewBag.Campanas而不是Model。或者你可以传入整个数据上下文(db),如果你关心的话。但是,这不是很好的做法。最好为视图创建单独的“视图模型”,并将linq-to-sql对象转换为视图模型。