2

我正在使用 MVC 体系结构和实体框架(数据库优先)开发一个 Intranet ASP Web 应用程序。我的问题是以下一个:

我有一个实体“Person”和一个实体“PhoneCard”,其中包括作为外键的“Person”的主键(因此,Id_Person)。我使用实体框架创建了一个 CRUD 控制器“PersonController”,Visual Studio 自动生成了相应的视图(索引、详细信息、创建、编辑和删除)。然后,我创建了另一个名为“PhoneCardController”的 CRUD 控制器(始终使用 EF)。在我的 Create Person 视图中,由于 AJAX 函数,我包含了 Create 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
}
4

1 回答 1

2

您的Person模型有一个集合属性PhoneCards,该属性在您的 Post 操作中始终为 null,因为您不尊重naming convention for binding to a list. 另外,您PhoneCard.cshtml的视图不是局部视图,而是完整视图(它包含错误<html><body>标签)。

我真的会向您推荐following articleSteven Sanderson 在其中详细解释了如何实现这一目标。它使用自定义Html.BeginCollectionItem助手来在输入字段的名称中生成非顺序索引,从而允许动态添加和删除行。

于 2013-03-01T16:04:27.657 回答