我正在使用MVC架构和实体框架(数据库优先)开发内部网ASP Web应用程序。我的问题是以下一个:
我有一个实体“Person”和一个实体“PhoneCard”,它包含“Person”的主键作为外键(所以,Id_Person)。我使用Entity Framework创建了一个CRUD控制器“PersonController”,并且Visual Studio自动生成了相应的视图(索引,细节,创建,编辑和删除)。然后,我创建了另一个名为“PhoneCardController”的CRUD控制器(总是使用EF)。在我的创建人员视图中,由于AJAX功能,我包含了创建PhoneCard视图:
function addPhoneCardCreateView() {
$('#divCreatePhoneCard').load("@Url.Action("Create","PhoneCard")");
}
并称之为:
<a href = "javascript:addPhoneCardCreateView()">Add a Phone card</a>
<div id = "divCreatePhoneCard"></div>
通过这样做,我调用我的局部视图,这样我就可以在添加人时添加电话卡。不幸的是,当我点击“创建”按钮时,它只会将新人添加到数据库中。这是我的PersonController中的Create动作:
public ActionResult Create()
{
ViewBag.Id_ProductPackageCategory = new SelectList(db.ProductPackageCategories, "Id_ProductPackageCategory", "Name");
return View();
}
//
// POST: /Person/Create
[HttpPost]
public ActionResult Create(Person person)
{
if (ModelState.IsValid)
{
db.Persons.AddObject(person);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.Id_ProductPackageCategory = new SelectList(db.ProductPackageCategories, "Id_ProductPackageCategory", "Name", person.Id_ProductPackageCategory);
return View(person);
}
我的部分观点:
@model BuSIMaterial.Models.PhoneCard
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create</title>
</head>
<body>
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>PhoneCard</legend>
<div class="editor-label">
@Html.LabelFor(model => model.PhoneNumber)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PhoneNumber)
@Html.ValidationMessageFor(model => model.PhoneNumber)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.SimNumber)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.SimNumber)
@Html.ValidationMessageFor(model => model.SimNumber)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PIN)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PIN)
@Html.ValidationMessageFor(model => model.PIN)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PIN2)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PIN2)
@Html.ValidationMessageFor(model => model.PIN2)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PUK)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PUK)
@Html.ValidationMessageFor(model => model.PUK)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PUK2)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PUK2)
@Html.ValidationMessageFor(model => model.PUK2)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Id_Person, "Person")
</div>
<div class="editor-field">
@Html.DropDownList("Id_Person", String.Empty)
@Html.ValidationMessageFor(model => model.Id_Person)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Id_PhoneSubscription, "PhoneSubscription")
</div>
<div class="editor-field">
@Html.DropDownList("Id_PhoneSubscription", String.Empty)
@Html.ValidationMessageFor(model => model.Id_PhoneSubscription)
</div>
</fieldset>
}
</body>
</html>
人物模型:
[EdmEntityTypeAttribute(NamespaceName="BuSIMaterialModel", Name="Person")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Person : EntityObject
{
#region Factory Method
/// <summary>
/// Create a new Person object.
/// </summary>
/// <param name="id_Person">Initial value of the Id_Person property.</param>
/// <param name="firstName">Initial value of the FirstName property.</param>
/// <param name="lastName">Initial value of the LastName property.</param>
/// <param name="numNat">Initial value of the NumNat property.</param>
/// <param name="startDate">Initial value of the StartDate property.</param>
/// <param name="upgrade">Initial value of the Upgrade property.</param>
/// <param name="id_ProductPackageCategory">Initial value of the Id_ProductPackageCategory property.</param>
/// <param name="houseToWorkKilometers">Initial value of the HouseToWorkKilometers property.</param>
public static Person CreatePerson(global::System.Int64 id_Person, global::System.String firstName, global::System.String lastName, global::System.String numNat, global::System.DateTime startDate, global::System.Boolean upgrade, global::System.Int64 id_ProductPackageCategory, global::System.Decimal houseToWorkKilometers)
{
Person person = new Person();
person.Id_Person = id_Person;
person.FirstName = firstName;
person.LastName = lastName;
person.NumNat = numNat;
person.StartDate = startDate;
person.Upgrade = upgrade;
person.Id_ProductPackageCategory = id_ProductPackageCategory;
person.HouseToWorkKilometers = houseToWorkKilometers;
return person;
}
#endregion
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int64 Id_Person
{
get
{
return _Id_Person;
}
set
{
if (_Id_Person != value)
{
OnId_PersonChanging(value);
ReportPropertyChanging("Id_Person");
_Id_Person = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Id_Person");
OnId_PersonChanged();
}
}
}
private global::System.Int64 _Id_Person;
partial void OnId_PersonChanging(global::System.Int64 value);
partial void OnId_PersonChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
[Required]
public global::System.String FirstName
{
get
{
return _FirstName;
}
set
{
OnFirstNameChanging(value);
ReportPropertyChanging("FirstName");
_FirstName = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("FirstName");
OnFirstNameChanged();
}
}
private global::System.String _FirstName;
partial void OnFirstNameChanging(global::System.String value);
partial void OnFirstNameChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
[Required]
public global::System.String LastName
{
get
{
return _LastName;
}
set
{
OnLastNameChanging(value);
ReportPropertyChanging("LastName");
_LastName = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("LastName");
OnLastNameChanged();
}
}
private global::System.String _LastName;
partial void OnLastNameChanging(global::System.String value);
partial void OnLastNameChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
[Required]
public global::System.String NumNat
{
get
{
return _NumNat;
}
set
{
OnNumNatChanging(value);
ReportPropertyChanging("NumNat");
_NumNat = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("NumNat");
OnNumNatChanged();
}
}
private global::System.String _NumNat;
partial void OnNumNatChanging(global::System.String value);
partial void OnNumNatChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.DateTime StartDate
{
get
{
return _StartDate;
}
set
{
OnStartDateChanging(value);
ReportPropertyChanging("StartDate");
_StartDate = StructuralObject.SetValidValue(value);
ReportPropertyChanged("StartDate");
OnStartDateChanged();
}
}
private global::System.DateTime _StartDate;
partial void OnStartDateChanging(global::System.DateTime value);
partial void OnStartDateChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public Nullable<global::System.DateTime> EndDate
{
get
{
return _EndDate;
}
set
{
OnEndDateChanging(value);
ReportPropertyChanging("EndDate");
_EndDate = StructuralObject.SetValidValue(value);
ReportPropertyChanged("EndDate");
OnEndDateChanged();
}
}
private Nullable<global::System.DateTime> _EndDate;
partial void OnEndDateChanging(Nullable<global::System.DateTime> value);
partial void OnEndDateChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Boolean Upgrade
{
get
{
return _Upgrade;
}
set
{
OnUpgradeChanging(value);
ReportPropertyChanging("Upgrade");
_Upgrade = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Upgrade");
OnUpgradeChanged();
}
}
private global::System.Boolean _Upgrade;
partial void OnUpgradeChanging(global::System.Boolean value);
partial void OnUpgradeChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
[Required]
public global::System.Int64 Id_ProductPackageCategory
{
get
{
return _Id_ProductPackageCategory;
}
set
{
OnId_ProductPackageCategoryChanging(value);
ReportPropertyChanging("Id_ProductPackageCategory");
_Id_ProductPackageCategory = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Id_ProductPackageCategory");
OnId_ProductPackageCategoryChanged();
}
}
private global::System.Int64 _Id_ProductPackageCategory;
partial void OnId_ProductPackageCategoryChanging(global::System.Int64 value);
partial void OnId_ProductPackageCategoryChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Decimal HouseToWorkKilometers
{
get
{
return _HouseToWorkKilometers;
}
set
{
OnHouseToWorkKilometersChanging(value);
ReportPropertyChanging("HouseToWorkKilometers");
_HouseToWorkKilometers = StructuralObject.SetValidValue(value);
ReportPropertyChanged("HouseToWorkKilometers");
OnHouseToWorkKilometersChanged();
}
}
private global::System.Decimal _HouseToWorkKilometers;
partial void OnHouseToWorkKilometersChanging(global::System.Decimal value);
partial void OnHouseToWorkKilometersChanged();
#endregion
#region Navigation Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("BuSIMaterialModel", "FK_bm_Persons_bm_ProductPackageCategories", "bm_ProductPackageCategories")]
public ProductPackageCategory ProductPackageCategory
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ProductPackageCategory>("BuSIMaterialModel.FK_bm_Persons_bm_ProductPackageCategories", "bm_ProductPackageCategories").Value;
}
set
{
((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ProductPackageCategory>("BuSIMaterialModel.FK_bm_Persons_bm_ProductPackageCategories", "bm_ProductPackageCategories").Value = value;
}
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[BrowsableAttribute(false)]
[DataMemberAttribute()]
public EntityReference<ProductPackageCategory> ProductPackageCategoryReference
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ProductPackageCategory>("BuSIMaterialModel.FK_bm_Persons_bm_ProductPackageCategories", "bm_ProductPackageCategories");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<ProductPackageCategory>("BuSIMaterialModel.FK_bm_Persons_bm_ProductPackageCategories", "bm_ProductPackageCategories", value);
}
}
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("BuSIMaterialModel", "FK_bm_PhoneCards_bm_Persons", "bm_PhoneCards")]
public EntityCollection<PhoneCard> PhoneCards
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<PhoneCard>("BuSIMaterialModel.FK_bm_PhoneCards_bm_Persons", "bm_PhoneCards");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<PhoneCard>("BuSIMaterialModel.FK_bm_PhoneCards_bm_Persons", "bm_PhoneCards", value);
}
}
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("BuSIMaterialModel", "FK_bm_ProductAllocations_bm_Persons", "bm_ProductAllocations")]
public EntityCollection<ProductAllocation> ProductAllocations
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<ProductAllocation>("BuSIMaterialModel.FK_bm_ProductAllocations_bm_Persons", "bm_ProductAllocations");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<ProductAllocation>("BuSIMaterialModel.FK_bm_ProductAllocations_bm_Persons", "bm_ProductAllocations", value);
}
}
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("BuSIMaterialModel", "FK_bm_VehicleFuelCards_bm_Persons", "bm_VehicleFuelCards")]
public EntityCollection<VehicleFuelCard> VehicleFuelCards
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<VehicleFuelCard>("BuSIMaterialModel.FK_bm_VehicleFuelCards_bm_Persons", "bm_VehicleFuelCards");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<VehicleFuelCard>("BuSIMaterialModel.FK_bm_VehicleFuelCards_bm_Persons", "bm_VehicleFuelCards", value);
}
}
}
#endregion
}
答案 0 :(得分:2)
您的Person
模型的集合属性PhoneCards
在您的Post操作中始终为null,因为您不尊重naming convention for binding to a list
。另外,您的PhoneCard.cshtml
不是局部视图,而是一个完整的视图(它包含<html>
和<body>
标记,这是错误的)。
我真的会向你推荐following article
,其中Steven Sanderson详细解释了如何实现这一点。它使用自定义Html.BeginCollectionItem
帮助程序,以便在输入字段的名称中生成非顺序索引,从而允许动态添加和删除行。