两个模型之间的一对一关系
本文关键字:之间 一对一 关系 模型 两个 | 更新日期: 2023-09-27 17:59:39
我有以下Model类(我首先使用EF代码生成表)。
public class MyClass
{
....
[Required, ForeignKey("Address")]
public int Address1Id { get; set; }
virtual public Address Address1 { get; set; }
[Required, ForeignKey("Address")]
public int Address12d { get; set; }
virtual public Address Address2 { get; set; }
[Required, ForeignKey("Address")]
public int Address3Id { get; set; }
virtual public Address Address3 { get; set; }
....
}
public class Address { .... }
我希望MyClass
的创建视图显示所有地址字段,并且在保存MyClass
时,地址将首先保存在address表中。但是脚手架为地址生成了一个DropDownList框。如何修改代码,使其表现为这些地址字段直接编码在类MyClass
中,并让控制器将表Address
中的地址和表AddressID
中的地址保存在表MyClass
中?
<div class="editor-label">
@Html.LabelFor(model => model.Address1Id, "Address")
</div>
<div class="editor-field">
@Html.DropDownList("Address1Id", String.Empty)
@Html.ValidationMessageFor(model => model.Address1Id)
</div>
更新:我试图创建以下ViewModel,但脚手架抱怨在类中没有定义键。
public class DealViewModel
{
public Deal Deal { get; set; }
public Address Address { get; set; }
}
您的外键属性不正确:
[Required, ForeignKey("Address1")]
...
[Required, ForeignKey("Address2")]
...
[Required, ForeignKey("Address3")]
...
(我猜Address12d
是一个打字错误)
听起来你在问如何在MVC中为编辑/创建视图展平模型。你不想创建一个人,然后去创建一个地址,而是在一个屏幕上创建它。如果这是你的要求,是的,你可以做到!事实上,做你想做的事情很简单,只需将你的创建视图更改为
<h3>Address 1</h3>
@Html.EditorFor(x => x.Address1)
<h3>Address 2</h3>
@Html.EditorFor(x => x.Address2)
...etc
默认情况下,MVC足够聪明,可以猜测Address
的"编辑器"应该是什么样子。字符串的文本字段、布尔的复选框等。如果您的[HttpPost]
控制器看起来像这样:
[HttpPost]
public ActionResult Create(Person person)
{
if (ModelState.IsValid)
{
var context = new AppDbContext();
context.People.Add(person);
context.SaveChanges();
return RedirectToAction("Index");
}
return View(personViewModel);
}
如果你在调试器中检查person
,你应该会看到Address
属性都被填充了。是的,MVC ModelBinder很聪明!你不应该做任何其他事情。
注意:随着项目的进展,数据模型不可避免地变得更加复杂,您可能会遇到在控制器与视图之间来回传递模型对象的问题。我强烈建议遵循使用ViewModels的模式,ViewModels是表示视图的"模型"的普通对象,也就是说,它应该捆绑进出客户端的所有数据。这将允许您展开数据模型,并且只包括您实际需要的字段。您可能不需要在这个特定的示例中使用此模式,但它在将来会有所帮助。
希望这能有所帮助!