从部分视图中获取模型数据

本文关键字:获取 模型 数据 视图 | 更新日期: 2023-09-27 18:01:48

我正在使用MVC架构和实体框架(数据库优先)开发一个内部网ASP web应用程序。我的问题如下:

我有一个实体"Person"和一个实体"PhoneCard",其中包括一个外键"Person"的主键(所以,Id_Person)。我使用实体框架创建了一个CRUD控制器"PersonController",Visual Studio自动生成了相应的视图(索引、详细信息、创建、编辑和删除)。然后,我创建了另一个CRUD控制器(总是使用EF),命名为"PhoneCardController"。在我的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>

通过这样做,我调用了我的局部视图,这样我就可以在添加一个人的同时添加一个电话卡。不幸的是,当我单击Create按钮时,它只向数据库中添加新的人员。下面是我的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);
    }

My Partial View:

@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
}

从部分视图中获取模型数据

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

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