2013-02-17 50 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的模式,這些模式是代表視圖「模型」的普通對象,也就是說,它應該捆綁所有去往和來自客戶端的數據。這將允許您平整數據模型,並只包含實際需要的字段。你可能不需要在這個特定的例子中使用這種模式,但它將在未來有所幫助。

希望這會有所幫助!

相關問題