Html 在下面给出的Create方法中,如何为一对一关系中的子操作添加视图?

Html 在下面给出的Create方法中,如何为一对一关系中的子操作添加视图?,html,asp.net-mvc-4,entity-framework-5,asp.net-4.5,razor-2,Html,Asp.net Mvc 4,Entity Framework 5,Asp.net 4.5,Razor 2,我有3个实体类;团队、团队联系人和团队地址 关系 -Team one-to-one TeamContact -TeamContact one-to-on TeamAddress namespace Soccer.Domain.Entities.Club { public class TeamAddress { //Team Mailing address [Key] [ForeignKey("TeamContact")] [HiddenI

我有3个实体类;团队、团队联系人和团队地址

关系

-Team one-to-one TeamContact
-TeamContact one-to-on TeamAddress
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; }
   }
 }
创建方法

[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);
    }
我的问题是,当我尝试搭建一个创建视图时,只有实体团队的标签和字段是搭建的。视图是强类型的agains团队实体,我猜这就是问题的根源所在。见下文

创建视图

@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>
}
团队地址

-Team one-to-one TeamContact
-TeamContact one-to-on TeamAddress
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; }
   }
 }

如何才能通过此操作?

您可以在视图中使用EditorTemplate,它将呈现团队对象上下文中的内容,以便在发布表单时使用模型绑定器

1) 在视图当前所在的文件夹中,创建名为“EditorTemplates”的子文件夹

2) 在此文件夹中创建一个新的局部视图,将其命名为与您尝试构建的模型相同的名称,例如TeamContact

3) 在TeamContact模型的新视图中编写HTML

4) 在团队的当前视图中,您现在可以执行以下操作

@Html.EditorFor(model => model.TeamContact)
MVC将识别出您具有此对象类型的自定义模板,并将使用您的局部视图来呈现页面

当您查看HTML页面中的标记时,您将看到它将控件呈现为

Team.TeamContact.EmailAddress
…为TeamContact提供针对团队对象的上下文

编辑器模板非常适合这种情况,特别是当您有一个子对象集合时,MVC将正确地为视图中的所有项编制索引


另外一件事,你应该考虑把你的“实体域”对象从你想在视图中渲染的东西中分离出来。视图模型用于此目的,并允许您将域\数据对象排除在表示层之外

您的
团队
团队联系人
团队地址
模型是如何定义的?您是否为
TeamContact
TeamAddress
声明了导航属性?@HTX9是的,我想如果没有导航属性,我不会编写该控制器,但我会发布它们供您查看。感谢您的建议,我现在正在尝试。不过,关于视图模型,我在过去考虑并使用了一个问题,但是我在根据视图模型编辑对象时遇到了麻烦。我还得回去用实际的域名来做。但是如果你对如何根据视图模型进行编辑有想法的话,我愿意回去这样做。谢谢,这很有效。另外,Pro.ASP.NET.MVC.3.Framework一书中有一节介绍了该主题。我只是读了它,主要是因为我需要关于强类型局部视图的信息。