【问题标题】:How to insert record using viewmodels : Asp.Net Mvc如何使用视图模型插入记录:Asp.Net Mvc
【发布时间】:2016-02-17 11:41:31
【问题描述】:

简介

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

需要制作视图模型是由于创建表单向导将信息存储在服务器端(会话变量)。

领域模型

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

问题

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

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

如果有人对此问题有任何想法,请提供帮助。任何形式的帮助或参考将不胜感激。感谢您的宝贵时间。

(由于缺乏知识,可能是我犯了一些错误。欢迎投反对票,但请留下评论,以便我改进问题。)

【问题讨论】:

  • 我看不到任何分离的控制器步骤。您有一个数据模型和相关实体。我建议您还分离您的数据访问点并创建一个控制器来将您的路由定向到与您的数据模型连接的特定方法。
  • @SophisticatedUndoing 感谢您的回复,我不确定您的意思是不是控制器代码....我会更新问题。
  • 我认为你需要看看自定义模型活页夹。您可以一次提交所有表单(步骤)并编写逻辑以从自定义模型绑定器中的 Request.Form 中提取数据
  • @Reddy 感谢您的帮助,我将研究“自定义模型活页夹”。请将其发布为答案.....有人可能会得到帮助
  • 我们使用Automapper automapper.org 来映射字段。这是非常有帮助的。保持代码干净。它还具有可自定义的前后映射功能。

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


【解决方案1】:

通过定义您自己的自定义模型绑定器将适用于此类场景。我建议您找到一些有用的资源来了解如何实现这一点,这也是一篇简单直接的文章CodeProject Custom Model Binder。让我知道这是否有用

【讨论】:

  • 我一定会反馈的。+1 的想法
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多