2012-03-21 2 views
0

MVC3をC#とRazorと共に使用し、EF4をコードで使用して、ユーザーを作成して操作できるサイトを作成します。MCV3エンティティフレームワーク4コードファースト:ユーザーの複数の電子メールの編集

public class User 
{ 
    [Key]   
    public int Id { get; set; } 
    public string User_Name { get; set; } 
    public string Password { get; set; } 
    public string First_Name { get; set; } 
    public string Last_Name { get; set; } 

    public virtual ICollection<Email> Emails { get; set; } 
} 

public class Email 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Address { get; set; } 
    public User User { get; set; }   
} 

User/Email関係は明らかである「1対多」:その非常にシンプル、かつオブジェクトの唯一の2種類があります。私はUserオブジェクトのCRUD関数を設定しており、(ほとんどの場合は)動作します。私はすべての自分の電子メールアドレスも編集できるように、ユーザーの編集ページを作っています。 (私は、彼らはまだなく、かなりそこに近い私を得たが、これに似た記事を見てきました)

マイEditビュー持つすべてが、私は、この持っているEmails、作業用のエディタ:

<div class="editor-label"> 
    @Html.LabelFor(model => model.Emails): 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Emails) 
    @Html.ValidationMessageFor(model => model.Emails) 
</div> 

@model LoginTest.Models.Email 
@Html.HiddenFor(model => model.Id) 

<div class="email-editor-field"> 
    @Html.EditorFor(model => model.Address) 
    @Html.ValidationMessageFor(model => model.Address) 
</div> 

結果は右に見えるのユーザーの電子メールアドレス、のそれぞれのテキストボックスでレンダリングされたページであることが、非常に仕事をdoesntの:@Html.EditorFor(model => model.Emails)は、次のようになります~/Views/Shared/EditorTemplates/Email.cshtmlを追加しています。ここにhtmlがあります:

<div class="editor-label"> 
    <label for="Emails">Email Address(es)</label>: 
</div> 

<div class="editor-field"> 

    <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Emails_0__Id" name="Emails[0].Id" type="hidden" value="1" /> 

    <div class="email-editor-field"> 
     <input class="text-box single-line" data-val="true" data-val-regex="Please enter a valid email address" data-val-regex-pattern=".+\@.+\..+" data-val-required="The Address field is required." id="Emails_0__Address" name="Emails[0].Address" type="text" value="[email protected]" /> 
     <span class="field-validation-valid" data-valmsg-for="Emails[0].Address" data-valmsg-replace="true"></span> 
    </div> 
    <br /> 

    <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Emails_1__Id" name="Emails[1].Id" type="hidden" value="2" /> 

    <div class="email-editor-field"> 
     <input class="text-box single-line" data-val="true" data-val-regex="Please enter a valid email address" data-val-regex-pattern=".+\@.+\..+" data-val-required="The Address field is required." id="Emails_1__Address" name="Emails[1].Address" type="text" value="[email protected]" /> 
     <span class="field-validation-valid" data-valmsg-for="Emails[1].Address" data-valmsg-replace="true"></span> 
    </div> 
    <br /> 

    <span class="field-validation-valid" data-valmsg-for="Emails" data-valmsg-replace="true"></span> 
</div> 

もう一度私は正しいと思った。しかしながら!フォームが送信されると、電子メールへの変更は無視されます。私は私が私のコントローラから何かが欠けていますことを推測ので、私はここにもいることを投稿します:

[HttpPost] 
public ActionResult Edit(int id, User User) 
{ 
    try 
    { 
     db.Entry(User).State = EntityState.Modified; 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); 
    } 
} 

答えて

1

あなたが同様ModifiedEmailエンティティの状態を設定する必要があります。ユーザエンティティの状態を設定すると、関連企業には影響しません:あなたのビューは、ユーザーの電子メールを追加または削除することができるようになるならば、これは動作しないこと

if (User.Emails != null) 
    foreach (var email in User.Emails) 
     db.Entry(email).State = EntityState.Modified; 

db.Entry(User).State = EntityState.Modified; 

注意を。上記のコードは、ユーザーの電子メールの変更にのみ適しています。

+0

それは素晴らしいです!私は何かが簡単でないことを知っていた。あなたは電子メールの追加/削除を容易にする最良の方法は何ですか?私はそこに私は[ここ](http://jarrettmeyer.com/post/2995732471/nested-collection-models-in-asp-net-mvc-3)の方法を実装するに刺すようにするつもりです – Ben

+0

@ベン:の私は通常このような手順を使用しています:http://stackoverflow.com/a/5540956/270591( "親"をユーザと "子供"に置き換えます)この例では電子メールで送信します)。 – Slauma

関連する問題