2013-02-17 49 views
1

我有以下模型类(我首先使用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时,地址将先保存在表地址。但脚手架为地址生成了一个DropDownList框。如何修改代码以使其具有类似这些地址字段的作用,并直接在类MyClass中编码,并让控制器将表和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> 

更新: 我试图创建下面的视图模型,但脚手架抱怨没有在类中定义键。

public class DealViewModel 
{ 
    public Deal Deal { get; set; } 
    public Address Address { get; set; } 
} 
+0

这是一个MVC或EF问题。 MVC可以使用这种模型。 EF期望适用于某个键的类型。复杂类型适合作为DB键。你希望达到什么目的? – 2013-02-17 07:24:41

回答

1

你的外键的属性是不正确的:

[Required, ForeignKey("Address1")] 
... 
[Required, ForeignKey("Address2")] 
... 
[Required, ForeignKey("Address3")] 
... 

(和Address12d是一个错字我猜)

1

这听起来像你问如何扁平化模型为在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); 
} 

如果你检查,你应该看到Address性能都充满在调试person是啊,MVC的。 ModelBinder是那么聪明!你不应该做任何事情。

注:正如你在你的项目进展和数据模型不可避免地变得越来越复杂,你可能会碰到传递模型对象来回控制器来查看问题。我强烈建议遵循一种使用ViewModel的模式,这些模式是代表视图“模型”的普通对象,也就是说,它应该捆绑所有去往和来自客户端的数据。这将允许您平整数据模型,并只包含实际需要的字段。你可能不需要在这个特定的例子中使用这种模式,但它将在未来有所帮助。

希望这会有所帮助!

相关问题