0

3 つのエンティティ クラスがあります。チーム、TeamContact、および TeamAddress。

関係

-Team one-to-one TeamContact
-TeamContact one-to-on TeamAddress

メソッドの作成

[HttpPost]
    public ActionResult Create(Team model)
    {
        if (ModelState.IsValid)
        {
            new Team
                {
                    Name = model.Name,
                    Division = model.Division,
                    Description = model.Description,

                    TeamContact = new TeamContact
                                        {
                                            EmailAddress = model.TeamContact.EmailAddress,
                                            PhoneNumber = model.TeamContact.PhoneNumber,

                                            TeamAddress = new TeamAddress
                                                            {
                                                                Box = model.TeamContact.TeamAddress.Box,
                                                                StreetName = model.TeamContact.TeamAddress.StreetName,
                                                                StreetNumber = model.TeamContact.TeamAddress.StreetNumber,
                                                                City = model.TeamContact.TeamAddress.City,
                                                                PostalCode = model.TeamContact.TeamAddress.PostalCode,
                                                                Province = model.TeamContact.TeamAddress.Province
                                                            }
                                    }
                };
            _dataSource.Save();
        }
        return View(model);
    }

私の問題は、作成ビューをスキャフォールディングしようとすると、エンティティ チームのラベルとフィールドのみがスキャフォールディングされることです。ビューはチームエンティティに対して強く型付けされています.これが私の問題の原因であると思います. 下記参照。

ビューを作成

@model Soccer.Domain.Entities.Club.Team

 @{
    ViewBag.Title = "Create";
   }

   <h2>Create</h2>

 @using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

     <fieldset>
        <legend>Team</legend>

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

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

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

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

チーム

namespace Soccer.Domain.Entities.Club
    {
       public class Team
       {
          //Holds players into a specific teams
          [HiddenInput(DisplayValue = false)]
          public virtual int Id { get; set; }

          [Display(Name = "Full Name:")]
          public virtual string Name { get; set; }

         //Current playing division
         [Display(Name = "Division:")]
         public virtual string Division { get; set; }

         [Display(Name = "About the team:")]
         [DataType(DataType.MultilineText)]
         public virtual string Description { get; set; }

         public virtual TeamContact TeamContact { get; set; }

         public virtual ICollection<Player> Players { get; set; }
     }
}

チーム連絡先

   namespace Soccer.Domain.Entities.Club
   {
      public class TeamContact
      {
        [Key]
        [ForeignKey("Team")]
        [HiddenInput(DisplayValue = false)]
        public virtual int TeamId { get; set; }

    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email:")]
    public virtual string EmailAddress { get; set; }

    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Phone:")]
    public virtual string PhoneNumber { get; set; }

    public virtual Team Team { get; set; }

    public virtual TeamAddress TeamAddress { get; set; }
  }
}

チーム住所

namespace Soccer.Domain.Entities.Club
{
  public class TeamAddress
  {
      //Team Mailing address
      [Key]
      [ForeignKey("TeamContact")]
      [HiddenInput(DisplayValue = false)]
      public virtual int TeamContactId { get; set; }

    [Display(Name = "P.O.Box:")]
    public virtual string Box { get; set; }

    [Display(Name = "Street Name:")]
    public virtual string StreetName { get; set; }

    [Display(Name = "Street Number:")]
    public virtual string StreetNumber { get; set; }

    [Display(Name = "City:")]
    public virtual string City { get; set; }

    [Display(Name = "Postal Code:")]
    public virtual string PostalCode { get; set; }

    [Display(Name = "Province:")]
    public virtual string Province { get; set; }

    public virtual TeamContact TeamContact { get; set; }
   }
 }

これを通過するにはどうすればよいですか?

4

1 に答える 1

1

Team オブジェクトのコンテキスト内でコンテンツをレンダリングするビューで EditorTemplate を使用して、フォームを投稿するときにモデル バインダーが機能するようにすることができます。

1) ビューが現在あるフォルダーに、「EditorTemplates」というサブフォルダーを作成します。

2) このフォルダーに新しい部分ビューを作成し、足場を作ろうとしているモデルと同じ名前を付けます (例: TeamContact)。

3) TeamContact モデルの新しいビューに HTML を記述します。

4) チームの現在のビューで、これを行うことができます...

@Html.EditorFor(model => model.TeamContact)

MVC は、このオブジェクト タイプのカスタム テンプレートがあることを認識し、部分ビューを使用してページをレンダリングします。

HTML ページのマークアップを見ると、コントロールが次のようにレンダリングされていることがわかります。

Team.TeamContact.EmailAddress

...TeamContact に Team オブジェクトに対するコンテキストを与えます。

エディター テンプレートは、特に子オブジェクトのコレクションがある場合に、この種の作業に最適です。MVC は、ビュー内のすべてのアイテムを正しくインデックス化します。

さらにもう 1 つ、ビューでレンダリングしようとしているものから「エンティティ ドメイン」オブジェクトを分割することを検討する必要があります。これにはビュー モデルが使用され、ドメイン\データ オブジェクトをプレゼンテーション レイヤーから除外することができます。

于 2012-11-27T17:23:55.243 に答える