2013-05-08 34 views
1

所以,我有以下2種模式:在EF/MVC中,是否可以編輯虛擬屬性?

[Table("Company")] 
public class Company { 
    public virtual List<UserAccount> Users { 
     get { 
      // I load my users here 
     } 
    } 
} 
[Table("UserAccount")] 
public class UserAccount { 
    public string email { get; set; } 
} 

在我看來,我嘗試編輯:

@model MyXsite2013.Company 
<table> 
foreach (UserAccount ua in Model.Users) { 
    <tr class="noRowHover"> 
     <td> 
      @Html.TextBoxFor(modelItem => ua.email) 
     </td> 
    </tr> 
} 
</table> 

而且在回發,我儘量節省:

public ActionResult Edit(Company companyModel) { 
    Company companyContext = database.Companies.Find(companyModel.ID); 
    database.Entry(companyContext).CurrentValues.SetValues(companyModel); 
    companyContext.IsActive = true; 
    database.SaveChanges(); 
} 

這當然不會保存對用戶的更改,實際上,它甚至沒有看到更改進入。

+0

根據對我的理解你的問題。我們不能在這種激情中使用,因爲虛擬關鍵字用於外鍵目的。如果我們使用虛擬關鍵字,則意味着集合將是延遲加載。如果我感到委屈,請糾正我。 – 2013-05-08 15:17:23

+0

PLease read [this](http://stackoverflow.com/questions/4949991/binding-collections-in-mvc)和[this](http://stackoverflow.com/questions/6852559/mvc3-modelbinding-to-一個信息收集發佈,背與指數隙)。在閱讀公司後,成功綁定後,您將更新公司的屬性和集合(merge \ removeAll + add)。 – lavrik 2013-05-08 15:20:28

+0

你應該在'@using(Html.BeginForm()){}'中包裝你的表單。 – 2013-05-08 19:32:08

回答

1

你的問題是你以錯誤的方式編寫你的視圖。如果你想綁定包含列表的模型,你應該爲它們設置特殊的名字。

喜歡的東西:

@model MyXsite2013.Company 
<table> 
@{ 
    var i=0; 
} 
@foreach (UserAccount ua in Model.Users) { 
    <tr class="noRowHover"> 
     <td> 
      <input type="text" name="Model.Users[@i].email"/> 
     </td> 
    </tr> 
    i++; 
} 
</table> 

關於這一主題的更多信息here

更新

可以使用的HtmlHelper方法:

@using(Html.BeginForm("Post", "Home", FormMethod.Post)) 
{ 
    int i = 0; 
    foreach (var ua in Model.Users) 
    { 
     @Html.TextBox(string.Format("Model.Users[{0}].email", i), ua.email) 
     i++; 
    } 
    <button type="submit">Submit</button> 
} 

而且應該有公衆二傳:

[Table("Company")] 
public class Company { 
    public virtual List<UserAccount> Users { 
     get; 
     set; 
    } 
} 
+0

你能澄清這一節:,我不相信它的作品。 – Bill 2013-05-08 15:57:55

+0

當然它應該是, – 2013-05-08 17:47:54

+0

我添加了使用HtmlHelper方法生成正確標記的代碼示例。 – 2013-05-08 18:14:55

0
  1. 你的公司模式的用戶屬性需要一個公共的制定者。沒有它,模型聯編程序將無法創建新的List實例來填充。

  2. 您不能在您的視圖中使用foreach循環,因爲html助手不會呈現正確回發所需的正確標記。您需要使用常規循環來代替。

0

我隨後基里爾Bestemyanov提供的答案,但做了一些修改:

[Table("Company")] 
public class Company { 
    public virtual List<UserAccount> Users { 
     get; 
     set; 
    } 
} 

和視圖:

@model MyXsite2013.Company 
<table> 
@{ 
    var i=0; 
} 
@foreach (UserAccount ua in Model.Users) { 
    <tr class="noRowHover"> 
     <td> 
      <input type="text" name="Users[@i].email" value="@ua.email"/> 
     </td> 
    </tr> 
    i++; 
} 
</table> 

而且回傳:

foreach (UserAccount ua in companyModel.Users) { 
    UserAccount UA_Context = database.UserAccounts.Find(ua.ID); 
    database.Entry(UA_Context).CurrentValues.SetValues(ua); 
} 
database.SaveChanges(); 
相關問題