如何从现有模型定义视图模型

How to define View Model from existing Model

我想知道如何从下面定义视图模型 class。

public class TestModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool HasCompleted { get; set; }
    public DateTime DeadLine { get; set; }
    public DateTime? CreatedDate { get; set; }
    public DateTime? LastModified { get; set; }
}

在上述模型中,只有 Id、Name、HasCompleted 和 Deadline 字段会显示给用户。否则字段 CreatedDate 和 LastModified 字段将在内部处理。

最初将使用上述所有字段创建数据库 table。但是,如前所述,为了避免过度发布攻击,我创建了一个包含所有必填字段的视图模型。现在,结构如下所示。

public class TestModel
{
    public TestVM testVM { get; set; }
    public DateTime? CreatedDate { get; set; }
    public DateTime? LastModified { get; set; }
} 
public class TestVM
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool HasCompleted { get; set; }
    public DateTime DeadLine { get; set; }
}

如果仍想维护单个数据库table并进行 CRUD 操作。但是,我在下面的操作中遇到了障碍。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(TestVM item)
    {            
        //Once the values are bound to TestVM. How do I get the instance of the TestModel to update the LastModified property here??
    }

有人可以指点一下吗?

此致, 拉姆

从 TestModel 中删除 TestViewModel class。

public class TestModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool HasCompleted { get; set; }
    public DateTime DeadLine { get; set; }
    public DateTime? CreatedDate { get; set; }
    public DateTime? LastModified { get; set; }
}

public class TestViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool HasCompleted { get; set; }
    public DateTime DeadLine { get; set; }
} 

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(TestViewModel item)
{            
    var testModel = new TestModel 
    {
        Name = item.Name,
        HasCompleted = item.HasCompleted,
        DeadLine  = item.DeadLine 
    };

   //testModel.CreateDate = DateTime.Now;
}

您还可以使用 Bind Attribute 来防止绑定 CreatedDateLastModified 字段:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Exclude("CreatedDate", "LastModified"))]TestModel item)
{            
}