代码之家  ›  专栏  ›  技术社区  ›  Vishal

在mvc中的controller中使用模型类是不是一种不好的做法?

  •  6
  • Vishal  · 技术社区  · 15 年前

    实例化 这个 直接在控制器中..不查询数据库,只使用模型类存储值。

    例如,如果我使用实体框架作为模型…那么使用实体类对象是不是一个坏习惯 在控制器中 . 有时直接使用在控制器中生成的数据库类比创建视图模型甚至视图数据更容易。我们有一个数据访问层和一个业务层,其中应用了所有查询和业务逻辑,但虽然更容易,但我不喜欢在控制器中访问模型的想法,但它真的是 ?

    4 回复  |  直到 15 年前
        1
  •  4
  •   Peter J    15 年前

    是的,这是一个糟糕的做法,因为问题是“过度张贴”。

    例如,考虑一个UserProfile的实体模型:

      public class UserProfile
      {
        public string UserName { get; set; }
        public bool IsAdmin { get; set; }
        public string EmailAddress { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
      }
    

    肆无忌惮的用户可以简单地修改表单,将“IsAdmin”和其他值一起发布。因为您的操作需要UserProfile的输入,所以IsAdmin值也将被映射,并最终持久化。

    这是 an excellent writeup about the perils of under and overposting .

    不过,我认为将实体模型直接绑定到[HttpGet]方法没有什么问题。

        2
  •  1
  •   Yaroslav Yakovlev    15 年前

        3
  •  0
  •   shaans    15 年前

    是的,通过练习。你应该保持控制器尽可能的瘦,并分离每个关注点。

        4
  •  0
  •   Tanktalus    9 年前

    Bind 属性可以用于实现相同的功能,如 this blog post .

    以Peter J的实体模型为例。在编辑方法中,您只需执行以下操作:

    [HttpPost]
    public ViewResult Edit([Bind(Include = "UserName, EmailAddress, FirstName, LastName")] User user)
    {
        // ...
    }
    

    此外,如博客文章中所述,您可以采用“黑名单”方法并告诉控制器操作要排除哪些字段:

    [HttpPost]
    public ViewResult Edit([Bind(Exclude= "IsAdmin")] User user)
    {
        // ...
    }
    

    也可以将其放置在实体模型的类名上方,如下所示:

    [Bind(Exclude="IsAdmin")]
    public class UserProfile
      {
        public string UserName { get; set; }
        public bool IsAdmin { get; set; }
        public string EmailAddress { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
      }