【问题标题】:Get model data from a partial view从局部视图中获取模型数据
【发布时间】:2013-03-01 14:33:37
【问题描述】:

我正在使用 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
}

【问题讨论】:

  • PhoneCard 局部视图是什么样子的?
  • 我刚刚发布了部分视图 =)
  • 您能展示一下您的PersonPhoneCard 模型吗?
  • 实际上,正如我所说,我首先使用了 EF 数据库,所以 VS 生成了一个 Model.Designer 我猜我的模型在哪里...等一下,我要发布它们。
  • 看来是我的模型占的地方太多了...我刚刚发布了 Person 模型,可以吗?

标签: c# javascript asp.net-mvc jquery asp.net-mvc-partialview


【解决方案1】:

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

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

【讨论】:

  • 感谢教程,我会照着做的。但是,我还有一个问题:“不遵守绑定到列表的命名约定”是什么意思?因为这些代码都是VS自动生成的。
  • 你可以看看下面的文章:haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx ASP.NET MVC 使用模型绑定器从请求中绑定动作参数。这意味着您在表单中的输入字段必须遵守此约定。代码自动生成的事实并不意味着它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2015-02-08
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多