使用忽略模型属性的viewmodel

时间:2018-01-05 14:31:16

标签: asp.net-core-mvc entity-framework-core

我使用实体框架和MVC(如果重要的话,都是CORE)来制作网站。使用模型并将其直接绑定到视图就可以了,所有CRUD操作都可以正常工作,一切都很可爱。

我想使用几个页面来访问模型,以便网站看起来更好,所以将控件分成不同的视图,并为每个视图添加相应的视图模型,所以我的项目看起来像这样

-Model
--CustomerModel
-ViewModel
--CustomerNameVM
--CustomerAddressVM
-View
--CustomerNameView
--CustomerAddressView

CustomerModel有许多属性

Forename
Surname
Address
Postcode

在CustomerNameVM中使用Forename和Surname,在CustomerAddressVM中使用地址和邮政编码。姓氏在模型中定义为[Required],但在CustomerNameVM中没有,我认为这是正确的方法。

我努力将模型加载到viewmodel中,然后在我编辑CustomerAddressView中的地址详细信息时尝试保存它,因为当我尝试保存视图模型时,它会出错。 t包含Surname(来自模型),因此它为null,因此[Required]条件未得到满足。

我尝试了一些试图解决这个问题的方法: -

  • Jeffrey Palermo的洋葱建筑
  • 存储库
  • 域名模型

除了其他都有同样问题的人之外,我无法保存地址,因为姓氏为空。

如何忽略未在viewmodel中引用的模型属性的验证标准? 或者,如何仅加载和引用viewmodel中存在的模型属性?

修改

对于那些一直要求代码的人,哪个代码集?我现在已经尝试过30个,其中没有一个能完成这项任务。你想要哪一个?我试图大致了解这应该是如何工作的,因为没有任何方法,文档和相关的例子能够发挥作用。

这里是10的首发,它与其他29个代码集不同,但它的代码可能是最短的。 控制器

    [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Step2Address(int? id, [Bind("CustomerID,txtAddress,txtPostcode")] VMAddress VMAddress) {

            if (ModelState.IsValid) {
//the saving code
            }
            return View(VMAddress);
        }

模型

  public class clsCustomer {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CustomerID { get; set; }

        public string Forename { get; set; }
        [Required]
        public string Surname { get; set; }
        public string Address { get; set; }
        public string Postcode { get; set; }

viewmodel

  public class VMAddress {

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CustomerID { get; set; }

    public string Address { get; set; }
    public string Postcode { get; set; }
}

视图

@model theProject.Models.VMStep2Contact

    <form asp-action="Step2Address">
        <input type="hidden" asp-for="ComplaintID" />
        <input asp-for="txtAddress"/>
        <input asp-for="txtPostcode"/>
        <input type="submit" value="Save" />

上下文

  public class ContextCustomer : DbContext {
        public ContextCustomer(DbContextOptions<ContextCustomer> options) : base(options) {

        }
        public DbSet<clsCustomer> Customer{ get; set; }
    }

点击&#34;保存&#34;在网页上立即调用控制器,它命中第一行if (ModelState.IsValid)并且由于姓氏没有设置,并且[Required]模型状态无效,因此不会尝试保存。

1 个答案:

答案 0 :(得分:0)

我实际上并不了解问题所在,如果没有代码,就无法说出你可能做错了什么。一般来说,由于您使用的是视图模型,因此不应该有任何问题。

视图模型当然不会直接保存到数据库中,因此必须将其映射到要保存的实际实体类。在编辑的情况下,您应该从数据库中检索所有相关实体,将任何已发布的值映射到这些实体上的相应属性,然后将这些实体保存回数据库。如果您正在执行此操作,可能是客户模型包含@{ ViewBag.Title = "Category Select"; Layout = "~/Views/Shared/_Simple_Layout.cshtml"; } @using (Html.BeginForm("CategoryChosen", "Home", FormMethod.Get)) { <fieldset> Movie Type @Html.DropDownList("MovieType") <p> <input type="submit" value="Submit" /> </p> </fieldset> } 和其他必需属性,并且您只需修改/设置地址属性。

如果您正在进行创作,那么,您只需获取地址信息即可。您也需要该名称,因此,您需要传递至少包含所有必填字段的视图模型,以便获得实际保存实体所需的所有信息。

如果您正在尝试执行多步骤表单,在那里收集多个帖子的所有信息,那么您只需将发布的数据保留在数据库以外的某个位置,直到您有足够的数据实际保存为止数据库的实体。这通常通过Surname / Session完成。