【问题标题】:How can I define DataAnnotations with ViewModel?如何使用 ViewModel 定义 DataAnnotations?
【发布时间】:2013-02-22 15:58:27
【问题描述】:

我使用“ADO.NET 实体数据模型”创建我的模型类,所以如果我更改我的数据库,我的模型类将会改变..

我的第一堂课来自“ADO.NET 实体数据模型”;

public partial class TableA
    {
        public TableA()
        {
            this.TableBs = new HashSet<TableB>();
        }

        public int TableAID { get; set; }
        public string TableAName { get; set; }

        public virtual ICollection<TableB> TableBs { get; set; }
    }

我的第二堂课来自“ADO.NET 实体数据模型”;

    public partial class TableB
    {
        public TableB()
        {
            this.TableAs = new HashSet<TableA>();
        }

        public int TableBID { get; set; }
        public string TableBName { get; set; }
        public int TableCID { get; set; }

        public virtual TableC TableC { get; set; }
        public virtual ICollection<TableA> TableAs { get; set; }
    }

我的第三课来自“ADO.NET 实体数据模型”;

    public partial class TableC
    {
        public TableC()
        {
            this.TableBs = new HashSet<TableB>();
        }

        public int TableCID { get; set; }
        public string TableCName { get; set; }

        public virtual ICollection<TableB> TableBs { get; set; }
    }

还有我的 ViewModel;

public class MyViewModel
{
    public TableA tableA { get; set; }
    public IEnumerable<TableB> tableBs { get; set; }
    public IEnumerable<TableC> tableCs { get; set; }
}

我想在我的 ViewModel 中这样做;

    [Required]
    [Display(Name = "TableA Name")]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    public string TableAName { get; set; }

我该怎么做??

【问题讨论】:

  • 您应该单独创建模型。还有一个包含这三个模型的 viewModel。
  • @AliRızaAdıyahşi,非常正确。最佳实践是拥有数据模型和表示模型。 dustqm,如果您绝对需要 DTO 上的数据注释,请使用伙伴类。

标签: asp.net-mvc entity-framework viewmodel data-annotations


【解决方案1】:

ViewModel 应该使用您生成的域类 (TableA)。

TableA 的

ViewModel example 将是以下类:

public class TableAViewModel {

  [Required]
  public int Id { get; set }

  [Required]
  [Display(Name = "TableA Name")]
  [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
  public string Name { get; set; }

  IEnumerable<TableBViewModel> TableBViewModels { get; set; }
}

在控制器中,您将通过TableA 类将检索到的属性从数据库移动到TableAViewModel 类中。在从视图回发时,您会将这些属性移回TableA

您可以使用AutoMapper 来执行此操作(对于对象和对象列表)

在您的视图模型TableAViewModel 中,您可以像我的示例中那样添加数据注释(取自您的课程)。它是您要使用的类,它们不会被任何东西自动重新生成,并且在您的视图中使用视图模型而不是域(数据库)类是一种很好的做法。

希望这会有所帮助。

【讨论】:

  • 我能问一下为什么你应该“不”在视图模型中使用生成的域类吗?关注点分离?
  • 不同的人生目标。首先将数据表示为正在存储和检索的数据(分层模型),后者专用于表示视图的各个数据块(因此称为视图模型)。它们不一定是 1 x 1 相关的(也不应该)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多