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

时间:2015-01-04 03:02:08

标签: asp.net-mvc-4

我想知道如何从类下面定义viewmodel。

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字段。

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

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; }
}

如果仍想维护单个数据库表并进行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??
    }

有人可以提出建议吗?

此致 拉姆

1 个答案:

答案 0 :(得分:0)

从TestModel类中删除TestViewModel。

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)
{            
}