2014-12-08 74 views
0

我有以下视图模型保存列表视图模式,以数据库

public class MyCVViewModel 
{ 
    [Required] 
    [StringLength(100, ErrorMessage = "Resume Title cannot exceed 100 characters.")] 
    [Display(Name = "Resume Title")] 
    public string ResumeTitle { get; set; } 
    [Required] 
    [StringLength(1000, ErrorMessage = "Personal Statment cannot exceed 1000 characters.")] 
    [Display(Name = "Personal Statement")] 
    public string Statement { get; set; } 

    public List<MyCompanyViewModel> Companies { get; set; } 
} 

public class MyCompanyViewModel 
{ 
    [Required] 
    [StringLength(100, ErrorMessage = "Company Name cannot exceed 100 characters.")] 
    [Display(Name = "Company Name")] 
    public string CompanyName { get; set; } 
    [Required] 
    [StringLength(100, ErrorMessage = "Job Title cannot exceed 100 characters.")] 
    [Display(Name = "Job Title")] 
    public string JobTitle { get; set; } 
    [Required] 
    [DataType(DataType.Date)] 
    [Display(Name = "Start Date")] 
    public DateTime JobStartDate { get; set; } 
    [Required] 
    [DataType(DataType.Date)] 
    [Display(Name = "End Date")] 
    public DateTime JobEndDate { get; set; } 
    [Required] 
    [StringLength(1000, ErrorMessage = "Job Description cannot exceed 1000 characters.")] 
    [Display(Name = "Job Description")] 
    public string JobDescription { get; set; } 
} 

我有一个控制器,从而节省了公司的列表视图模型:

public ActionResult Create() 
{ 
    var model = new MyCVViewModel() 
    { 

    }; 

    model.Companies = new List<MyCompanyViewModel>(); 
    model.Companies.Add(new MyCompanyViewModel() { CompanyName = "Company1", JobTitle = "Gyprocker", JobDescription = "Hello" }); 
    model.Companies.Add(new MyCompanyViewModel() { CompanyName = "Company2", JobTitle = "Gyprocker2", JobDescription = "Hello" }); 
    model.Companies.Add(new MyCompanyViewModel() { CompanyName = "Company3", JobTitle = "Gyprocker3", JobDescription = "Hello" }); 
    model.Companies.Add(new MyCompanyViewModel() { CompanyName = "Company4", JobTitle = "Gyprocker4", JobDescription = "Hello" }); 

    return View("~/Views/Dashboard/CV/Create.cshtml", model); 
} 

现在我也不知道是什么如何将此列表视图模型发布回数据库,我正在使用实体框架代码第一种方法,这是我尝试的:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(MyCVViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View("~/Views/Dashboard/CV/Create.cshtml", model); 
    } 
    else 
    { 
     var cv = new CV(); 

     cv.Title = model.ResumeTitle; 
     cv.Statement = model.Statement; 
     cv.Id = User.Identity.GetUserId(); 
     cv.Companies = new List<Company>(); 
     foreach (var company in model.Companies) 
     { 
      cv.Companies.Add(company); //this line has error saying cannot convert viewmodel to entity 
     } 

     repository.AddCV(cv); 

     return RedirectToAction("List"); 
    } 
} 

那么添加一个list viewmodel到数据库的最佳方式是什么?

更新

foreach (var company in model.Companies) 
{ 
    cv.Companies.Add(
      new Company 
      { 
       CompanyName = company.CompanyName, 
       JobTitle = company.JobTitle, 
       StartDate = company.JobStartDate, 
       EndDate = company.JobEndDate, 
       Description = company.JobDescription 
      }); 
} 

尝试这样做,它的工作原理,有没有其他办法?

+0

在你'foreach'循环,你需要初始化一个新的'Company'(数据实体),然后映射'MyCompanyViewModel'的属性到'公司' – 2014-12-08 01:21:53

+0

您真的想在视图中显示固定数量(4)的公司吗? – 2014-12-08 01:30:10

+0

@Stephen不,它不会是一个固定的数字4,我会从用户输入公司获得 – Mindless 2014-12-08 01:32:52

回答

1

foreach循环,你需要初始化一个新Company

foreach (var item in model.Companies) 
{ 
    Company company = new Company() 
    { 
    CompanyName = item.CompanyName, 
    JobTitle = item.JobTitle, 
    // etc for other properties 
    }; 
    cv.Companies.Add(company); 
} 
+0

还有其他更好的方法吗? – Mindless 2014-12-08 01:34:01

+1

您可以使用[automapper](https://github.com/AutoMapper/AutoMapper)等工具使其更简单 - 仅仅意味着您的代码更少,但其本质上与代码完全相同。我问到公司数量的原因是我刚刚发布[这个答案](http://stackoverflow.com/questions/27340434/how-to-put-two-arrays-as-key-and-values-of-each -other-in-c/27349929#27349929)关于如何在视图中动态添加删除集合项 – 2014-12-08 01:37:02

+0

这实际上是我现在要找的,谢谢你的回答链接 – Mindless 2014-12-08 01:38:21