Html 在下面给出的Create方法中,如何为一对一关系中的子操作添加视图?
我有3个实体类;团队、团队联系人和团队地址 关系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
-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一书中有一节介绍了该主题。我只是读了它,主要是因为我需要关于强类型局部视图的信息。