我使用实体框架和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]
条件未得到满足。
我尝试了一些试图解决这个问题的方法: -
除了其他都有同样问题的人之外,我无法保存地址,因为姓氏为空。
如何忽略未在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]
模型状态无效,因此不会尝试保存。
答案 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
完成。