【问题标题】:Best practice for MVC in .net C#.net C# 中 MVC 的最佳实践
【发布时间】:2015-06-24 00:58:00
【问题描述】:

我是 MVC 框架的新手。我正在使用 entityframework DBcontext 来执行与数据库相关的操作。我正在这样做 Entityframework-->dbcontext-->Model-->Controller--> View。 我直接将模型绑定到视图。例如有表名 UserProfile 并且我创建了具有相同名称和列的模型作为模型的属性。我正在从 Userprofile 中提取记录集合,并将该集合直接绑定到 View。 这是模型

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [DisplayName("ID")]

    public long UserId { get; set; }
    private string _UserName;
    public string UserName
    {
        get { return _UserName; }
        set { _UserName = value; }

    }
    public string Thalassemic
    {
        get;
        set;
    }

    [Display(Name = "Your First Name")]
    [Required(ErrorMessage = "First Name is Required.")]
    [StringLength(30, ErrorMessage = "First Name must be {2}-{1} to long", MinimumLength = 2)]
    [RegularExpression("^[a-zA-z ]+$", ErrorMessage = "First name must contain only characters")]
    public string FirstName { get; set; }

    [Display(Name = "Your Last Name")]
    [Required(ErrorMessage = "Last Name is Required.")]
    [RegularExpression("^[a-zA-z ]+$", ErrorMessage = "Only characters are allowed.")]
    [StringLength(20, ErrorMessage = "First Name must be {2}-{1} to long", MinimumLength = 2)]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Email Address is Required.")]
    [StringLength(250, ErrorMessage = "{0} must be {2}-{1} to long", MinimumLength = 4)]
    [Display(Name = "Email Address")]
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter a valid email-address.")]
    [RegularExpression("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$", ErrorMessage = "Please enter a valid email-address.")]
    //todo: re-think about updating email address as we are user email as login id and this can't change
    public string Email { get; set; }}

我应该使用这个 DTO 对象来绑定数据和视图

public class UserProfileDTO
{
    public long UserId { get; set; }
    private string _UserName;
    public string UserName
    {
        get { return _UserName; }
        set { _UserName = value; }
    }
    public string Thalassemic
    {   get;
        set;
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

基于以上我想知道这是正确的方法吗?如果不是,那么最佳做法是什么?

【问题讨论】:

标签: c# asp.net-mvc entity-framework


【解决方案1】:

在 MVC 中通常不鼓励使用数据库 POCO 类作为模型,以代替仅包含视图所需数据的视图模型。假设您有一个包含 30 多个字段的 User 记录,但您只想显示 Username,您可以简单地创建一个 UsernameViewModel

public class UsernameViewModel
{
    public string Username { get; set; }
}

它更简洁,因为您只向客户端发送您需要的字段。

【讨论】:

  • @matytommo,感谢您的回答,但这不是我的问题。我有更新问题以便更好地澄清。我只想知道整个 EF 模型绑定到视图是不是好主意?
  • @TarsemSingh 这该问题的答案:)。您不应该在视图中使用 EF 类,建议不要这样做。
  • 这意味着我应该使用 DTO 类来绑定到视图。正确的 ?如果这是正确的,那么您能告诉我直接绑定模型以查看的缺点是什么。
  • @TarsemSingh 不,您不应该使用 DTO,这就是我要说的。这将您的数据库代码与您应该做的 UI 层分开。这也意味着视图中没有任何通过遍历对象图的数据库调用(想想Parent.Child.GrandChild,这将生成数据库查询)。更多的是关注点分离。
【解决方案2】:

正如@mat 所说,不建议直接在视图中使用 POCO 类。 建议不要这样做,因为用户永远不能修改 POCO 值,此外,当您想向用户显示多个 POCO 时会发生什么? (我希望您的回答不是“修改 POCO 以满足用户的要求”)。

此外,如果您的应用程序是 n 层,强烈建议使用一些 DTO 在层之间传输数据。

作为使用 DTO 类的建议和好处,您可以查看 msdn 链接 here,或者作为演示部分,有一个很好的教程,根据您对 codeproject here 的要求使用什么。

阅读有关您的问题的更多信息 here

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 2016-02-27
    • 2011-02-04
    • 2013-04-24
    • 2021-10-18
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多