编辑模型,包括导航属性 MVC4



我有一个人物模型:

Partial Public Class Person
Public Property Id As Long
<DisplayName("Fornavn")>
Public Property Firstname As String
<DisplayName("Efternavn")>
Public Property Lastname As String
Public Property chr_cpr As String
<DisplayName("Medarbejdernummer")>
Public Property EmployeeNumber As String

Public Overridable Property Accounts As ICollection(Of Account) = New HashSet(Of Account)
Public Overridable Property PaymentCards As ICollection(Of PaymentCard) = New HashSet(Of PaymentCard)
Public Overridable Property PaymentRoles As ICollection(Of PaymentRole) = New HashSet(Of PaymentRole)
Public Overridable Property AllPaymentRoles As ICollection(Of PaymentRole) = New HashSet(Of PaymentRole)
Public Overridable Property BillableDepartments As ICollection(Of Department) = New HashSet(Of Department)
Public Overridable Property AllDepartments As ICollection(Of Department) = New HashSet(Of Department)
Public Overridable Property AccessablePosDevices As ICollection(Of PosDevice) = New HashSet(Of PosDevice)
Public Overridable Property AllPosDevices As ICollection(Of PosDevice) = New HashSet(Of PosDevice)
End Class

还有一个账户模型:

Partial Public Class Account
Public Property Id As Long
Public Property PersonId As Long
Public Property Balance As Decimal
Public Property SchemaId As Long
Public Property HasAutoRefill As Boolean
Public Overridable Property Schema As AccountSchema
Public Overridable Property Person As Person
End Class

和支付卡模型:

Partial Public Class PaymentCard
Public Property Id As Long
Public Property Serial As String
Public Property TypeId As Nullable(Of Long)
Public Property IsActive As Boolean
Public Property PersonId As Long
Public Overridable Property Type As CardType
Public Overridable Property Person As Person
End Class

我希望能够从"人员/编辑"视图中编辑"人员"、"支付卡"和"帐户"属性。我正在使用编辑器模板。这是我的观点:

@ModelType IDCompany.WEB.Person
@Using Html.BeginForm()
    @Html.ValidationSummary(True)
@<fieldset>
        <legend>Person</legend>
    @Html.HiddenFor(Function(model) model.Id)
    <div class="editor-label">
        @Html.LabelFor(Function(model) model.Firstname)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.Firstname)
        @Html.ValidationMessageFor(Function(model) model.Firstname)
    </div>
    <div class="editor-label">
        @Html.LabelFor(Function(model) model.Lastname)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.Lastname)
        @Html.ValidationMessageFor(Function(model) model.Lastname)
    </div>
    <div class="editor-label">
        @Html.LabelFor(Function(model) model.chr_cpr)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.chr_cpr)
        @Html.ValidationMessageFor(Function(model) model.chr_cpr)
    </div>
    <div class="editor-label">
        @Html.LabelFor(Function(model) model.EmployeeNumber)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.EmployeeNumber)
        @Html.ValidationMessageFor(Function(model) model.EmployeeNumber)
    </div>
 </fieldset>

@<table class="cardTable">
    <tr>
        <th>Id</th>
        <th>Serienummer</th>
        <th>Type</th>
        <th>Aktiv</th>
    </tr>
    @Html.EditorFor(Function(x) x.PaymentCards)
</table>
@Html.EditorFor(Function(x) x.Accounts)

@<p><input type="submit" value="Save" /></p>
End Using
<div>
    @Html.ActionLink("Back to List", "Index")
</div>
@Section Scripts
    @Scripts.Render("~/bundles/jqueryval")
End Section

这是我的人/编辑模板/帐户:

@ModelType IDCompany.WEB.Account
    @Html.EditorFor(Function(model) model.PersonId)
    @Html.EditorFor(Function(model) model.Id)
    @Html.EditorFor(Function(model) model.HasAutoRefill)
    @Html.EditorFor(Function(model) model.SchemaId)

和我的人/编辑模板/支付卡:

@ModelType IDCompany.WEB.PaymentCard

        @Html.HiddenFor(Function(model) model.TypeId)
        @Html.HiddenFor(Function(model) model.PersonId)
        @Html.HiddenFor(Function(model) model.Id)
        @Html.HiddenFor(Function(model) Model.Serial)
        @Html.HiddenFor(Function(model) Model.Type.Name)
 <tr class="cardRow">
            <td>@Model.Id</td>
            <td>@Model.Serial</td>
            <td>@Model.Type.Name</td>
           <td>@Html.EditorFor(Function(model) model.IsActive)</td>
 </tr>

这是我的PersonController中的编辑功能:

        <HttpPost()> _
    Function Edit(ByVal person As Person) As ActionResult
        Dim kontoSubMenu As New List(Of MenuPoint)
        Dim emptyList As New List(Of String)
        kontoSubMenu.Add(New MenuPoint("Kantine", emptyList, "Kontooplysninger", "Home", "All"))
        kontoSubMenu.Add(New MenuPoint("Personer", emptyList, "Personer", "Person", "All"))
        kontoSubMenu.Add(New MenuPoint("Test", emptyList, "LogUd", "Home", "All"))
        ViewBag.kontoSubMenu = kontoSubMenu
        If ModelState.IsValid Then
            Dim paymentcardList
            paymentcardList = person.PaymentCards.ToList()
            For Each pc In paymentcardList
                db.Entry(pc).State = EntityState.Modified
                db.SaveChanges()
            Next
            Dim accountList
            accountList = person.Accounts.ToList()
            For Each ac As Account In accountList
                db.Entry(ac).State = EntityState.Modified
                'Dim accountValue As Account = db.Accounts.Find(accountt.Id)
                db.SaveChanges()
            Next
            db.Entry(person).State = EntityState.Modified
            db.SaveChanges()
            Return RedirectToAction("Index")
        End If
        Return View(person)
    End Function

我是MVC的新人。当我尝试在视图中编辑 som 数据时,出现错误:"发生参照完整性约束冲突:定义参照约束的属性值在关系中的主体对象和从属对象之间不一致。"条目(个人)。状态 = 实体状态.已修改"

我做错了什么?

代码中存在一些问题:

  1. 你为什么在行动中多次打电话给db.SaveChanges()?最后只应调用一次。全部保存或全部保存。
  2. 当模型绑定程序为操作创建参数对象时,它对 EF 一无所知。例如,不会设置 PaymentCard 对象的 Person 属性。这可能是 EF 在尝试通过调用 db.Entry(pc).State = EntityState.Modified 将对象重新附加到数据上下文时抱怨的一点。您应该从数据库中按 id 重新查询对象并映射所需/更改的属性。最好不要将 EF 类直接传递给视图,而是使用普通 ViewModel 类。
  3. EditorFor用于类型为 ICollection(Of PaymentCard) 的属性Person.PaymentCards。您的编辑器模板的模型类型为 PaymentCard 。那行不通。你可以为ICollection(Of PaymentCard)编写另一个编辑器模板,或者只是在你的视图中迭代(对不起,在 C# 中):

    @foreach(var acc in Model.Accounts) {
        @Html.EditorFor(m => acc)
    }
    

相关内容

  • 没有找到相关文章

最新更新