vb.net - 更新 mvc4 中的对象列表

标签 vb.net asp.net-mvc-4

我已经解决了 ASP.NET MVC4 应用程序遇到的问题并对其进行了简化,以便我可以将其发布到此处。我的基本问题是,我试图将项目列表发送到我的 View 并编辑任何项目的复选框,然后将列表项目发送回 Controller 并最终能够保存到数据库。现在编写代码的方式是,当我将列表发送回 Controller 时,它会显示为空值,就像它从未实例化一样。

代码如下:

Public Class Person
    Property ID As Integer
    Property Name As String
    Property Active As Boolean
End Class

在 Controller 中,我调用了一个名为 BuildPeople 的类,它实际上只是构建要传递的列表的一种方法:

Public Class BuildPeople

    Public Function GetPersonList() As List(Of Person)
        Dim personList As New List(Of Person)
        personList.Add(GetPerson(1, "Chris", True))
        personList.Add(GetPerson(2, "Ken", True))
        personList.Add(GetPerson(3, "Jen", True))
        Return personList
    End Function

    Private Function GetPerson(id As Integer, name As String, active As Boolean) As Person
        Dim p As New Person
        p.ID = id
        p.Name = name
        p.Active = active
        Return p
    End Function  
End Class

Controller 只有编辑能力:

    Imports System.Web.Mvc

Public Class PeopleController
    Inherits Controller

    ' GET: /People
    Function Index() As ActionResult
        Return View()
    End Function

    ' GET: /People/Edit/5
    Function Edit() As ActionResult
        Dim bp As New BuildPeople
        Dim model As New List(Of Person)
        model = bp.GetPersonList
        ViewData.Model = model
        Return View()
    End Function

    ' POST: /People/Edit/5
    <HttpPost()>
    Function Edit(ByVal listPeople As List(Of Person)) As ActionResult
        Try
            ' TODO: Add update logic here
            If listPeople Is Nothing Then
                'Don't want to end up here
                Return View()
            Else
                'Want to end up here
                Dim i As Integer = listPeople.Count
                Return View()
            End If
        Catch
            Return View()
        End Try
    End Function
End Class

然后 View 如下:

@ModelType List(Of Person)
@Code
    ViewData("Title") = "Edit"
    Layout = "~/Views/Shared/_Layout.vbhtml"
End Code

<h2>Edit</h2>

@Using (Html.BeginForm())
    @Html.AntiForgeryToken()

    @<div class="form-horizontal">
        <h4>Person</h4>
        <hr />
        @For Each item In Model
        Dim currentitem = item
            @Html.HiddenFor(Function(model) currentitem.ID)
            @Html.EditorFor(Function(model) currentitem.Name)
            @Html.EditorFor(Function(model) currentitem.Active)
        Next

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
End Using

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

最佳答案

因此,您必须了解 HTML 表单的工作原理以及 MVC 模型绑定(bind)程序的工作原理。

复选框仅在被选中时在发布数据中发送回值如果它们被选中

接下来,只要字段命名遵循正确的命名约定,MVC 中的模型绑定(bind)器就会重新构建集合/列表对象。

因此,您的循环 For Each item In Model 需要生成具有正确名称的项目。

让我们稍微改变一下你的模型。

Public Class PeopleModel
  Public Property People As List(Of Person)
  Public Property SelectedPeople As List(Of Int64)  ' Assuming Person.ID is Int64
End Class

然后你改变 View 的循环,如下所示:

Dim itemIndex As Int32 = 0
For Each person As Person In Model.People
  @<input type='checkbox' name='SelectedPeople[@itemIndex]' id='<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="97e7f2e5e4f8f9c8d7e7f2e5e4f8f9b9ded3" rel="noreferrer noopener nofollow">[email protected]</a>' value='@person.ID' />
  @<input type='hidden' name='SelectedPeople[@itemIndex]' value='-1' />
  itemIndex += 1
Next

我们将隐藏元素放在那里,因为它将为未选中的项目提供字段值。否则第一个未选中的项目将破坏索引并且模型绑定(bind)器将停止。

现在在 Controller 的帖子处理程序中:

<HttpPost>
Public Function ActionName(model As PeopleModel) As ActionResult

  For Each id As Int64 In model.SelectedPeople
    If 0 < id Then
      ' This is the id of a selected person - do something with it.
    End If
  Next

End Function

关于vb.net - 更新 mvc4 中的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19823604/

相关文章:

c# - 导出 CSV 文件不适用于双引号值

c# - 将整个调试控制台输出发送到剪贴板?

asp.net - 从日期时间减去 1 年

c# - Web API 中的单元测试自定义路由

c# - 将 WebApi.HelpPage 添加到 webApi 项目后出现 StructureMap 异常

vb.net - VB.NET中的渐变填充

vb.net - 泛化递增嵌套循环算法

c# - 让 Visual Studio 使用自定义主机 factoryType 突出显示 Razor 语法

asp.net-mvc - ASP.NET MVC4 中的显示模式

asp.net - 从 MVC 4 WebApi 中的 POST 读取 http 内容