如何使用viewmodels插入记录:Asp.Net Mvc

时间:2016-02-17 11:41:32

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-viewmodel

简介

我正在使用mvc项目,实现方法是代码优先的。 我正在使用的域模型,有超过70个字段。所以我制作了ViewModels。

创建视图模型需要创建表单向导,该向导在服务器端存储信息(会话变量)。

域名模型

public class RegisterationDM
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        public int RegisterationId { get; set; }
//other fields
}

主视图模型

public class RegistrationViewModel
{
        public PersonalViewModel PersonalViewModel {get;set; }
        public DetailViewmodel DetailedViewmodel { get; set; }
        public PhysicalDetailViewModel PhysicalDetailViewModel { get; set; }
        public RequirementViewModel RequirementViewModel { get; set; }
        public CreationInfoViewModel CreationInfoViewModel { get; set; }
}

单独的课程

public class PersonalViewModel()
{
//fields
}
public class DetailViewmodel()
{
//fields
}
public class PhysicalDetailViewModel()
{
//fields
}
public class RequirementViewModel()
{
fields
}
public class CreationInfoViewModel()
{
//fields
}

记录广告代码

public ActionResult SaveInformation()
        {
            RegisterationDM regdm = new RegisterationDM();
            RegistrationViewModel regvm = new RegistrationViewModel();

            PersonalViewModel personalvm = (PersonalViewModel)Session["Personal"];
            DetailViewmodel detailvm = (DetailViewmodel)Session["Detail"];
            PhysicalDetailViewModel physicalvm = (PhysicalDetailViewModel)Session["Physical"];
            RequirementViewModel requirementvm = (RequirementViewModel)Session["Requirement"];

            CreationInfoViewModel createdinforvm = new CreationInfoViewModel();
            createdinforvm.CreatedBy = "";
            createdinforvm.CreatedDate = DateTime.Now;

            regvm.PersonalViewModel = personalvm;
            regvm.DetailedViewmodel = detailvm;
            regvm.PhysicalDetailViewModel = physicalvm;
            regvm.RequirementViewModel = requirementvm;
            regvm.CreationInfoViewModel = createdinforvm;
            //here assigning of view model to domain model
            db.Reg.Add(regdm);
            db.SaveChanges();
            return View();
        }

所有操作(已更新)

public ActionResult Step1()
        {
            RegistrationViewModel regvm = new RegistrationViewModel();
            return View(regvm.PersonalViewModel);
        }
        [HttpPost]
        public ActionResult Step1(PersonalViewModel personalvm)
        {
            if (ModelState.IsValid)
            {
                //Store the wizard in session
                Session["Personal"] = personalvm;
                return RedirectToAction("Step2");
            }
            else
            { 
            return View(personalvm);
            }
        }

        public ActionResult Step2()
        {
            if (Session["Personal"] != null)
            {
                RegistrationViewModel regvm = new RegistrationViewModel();
                return View(regvm.DetailedViewmodel);
            }
            else
            {
                return RedirectToAction("Step1");
            }
        }
        [HttpPost]
        public ActionResult Step2(DetailViewmodel detailvm)
        {
            if (ModelState.IsValid)
            {
                //Store the wizard in session
                Session["Detail"] = detailvm;
                return RedirectToAction("Step3");
            }
            return View(detailvm);
        }

        public ActionResult Step3()
        {
            if (Session["Detail"] != null && Session["Personal"] != null)
            {
                RegistrationViewModel regvm = new RegistrationViewModel();
                return View(regvm.PhysicalDetailViewModel);
            }
            else
            {
                return RedirectToAction("Step1");
            }
        }
        [HttpPost]
        public ActionResult Step3(PhysicalDetailViewModel physicalsvm)
        {
            if (ModelState.IsValid)
            {
                //Store the wizard in session
                Session["Physical"] = physicalsvm;
                return RedirectToAction("Step4");
            }
            return View(physicalsvm);
        }

        public ActionResult Step4()
        {
            if (Session["Detail"] != null && Session["Personal"] != null && Session["Physical"] != null)
            {
                RegistrationViewModel regvm = new RegistrationViewModel();
                return View(regvm.RequirementViewModel);
            }
            else
            {
                return RedirectToAction("Step1");
            }
        }
        [HttpPost]
        public ActionResult Step4(RequirementViewModel requirementvm)
        {
            if (ModelState.IsValid)
            {
                Session["Requirement"] = requirementvm;
                return RedirectToAction("SaveInformation");
            }
            return View(requirementvm);
        }

问题

如何使用主视图模型添加(记录)。我应该先映射吗?

我理解它不可能那样。所以我问,有没有一种正确的方法可以做到这一点。它可能是什么?最好的方式,正确的方式还是错误的方式? 即使难以实施,我也会更喜欢标准实施。

如果有人对此问题有所了解,请提供帮助。我们将非常感谢您的帮助或参考。谢谢您的时间。

(由于缺乏知识,可能会犯一些错误。欢迎选民投票,但请留下评论,以便我可以提出问题。)

2 个答案:

答案 0 :(得分:1)

通过定义自己的自定义模型绑定器将适用于此类方案。我建议你找一些有用的资源来获得如何实现它的知识,这也是一篇简单直接的文章CodeProject Custom Model Binder。如果这是有用的,请告诉我

答案 1 :(得分:1)

我们使用Automapper来映射字段。这非常有帮助。保持代码清洁。它也具有可自定义的前后映射功能。