剃刀页面:从页面获取字符串列表到页面模型

时间:2020-01-10 23:48:48

标签: c# asp.net string arraylist razor-pages

我的剃须刀页面术语不是最好的,所以如果措辞不当,我深表歉意。

在我的应用程序中,用户提供了一个订单号,我给他们提供了与之关联的零件号列表(除其他外)。我使用一个foreach循环来创建并填充足够的输入字段,以保存所有零件号。基本上,用户可以更改零件号(客户要求),然后提交表格。

我的问题来自于从页面中获取新值并将它们带入POST请求中的页面模型中。使用int列表可以轻松获取整数,但是必须使用.Add()填充字符串列表。我和Google搜索似乎都对如何从页面中获取这些字符串值并进入页面模型一无所知,特别是因为Google似乎更愿意向我展示涉及下拉列表而不是字符串列表的问题。

这是我提到的字符串列表。在构造函数中对其进行了初始化。

[DisplayName("Part Number"), BindProperty, Required]
[StringLength(48, MinimumLength = 1, ErrorMessage = "Please enter a part number.")]
public List<string> PartNumberList { get; set; }

页面本身的相关部分:

@foreach (var part in Model.PartInfoList)
            {
            <tr class="row table-bordered">
                <td class="col-4">
                    <input type="hidden" asp-for="OldPartIDList" value="@part.PART_ID" name="OldPartIDList"/> @*This holds the "old" part ID's so the order can still be looked up when the user wants to change the part ID.*@
                    <input type="text" class="form-control mb-2 mr-sm-2" asp-for="NewPartIDList" value="@part.PART_ID" id="@part.PART_ID" name="NewPartIDList" onchange="HighlightField(this)" />
                    @*The id here is used to determine if the field should be highlighted or not.*@
                    <span class="text-danger" asp-validation-for="NewPartIDList"></span>
                </td>
                <td class="col-4">
                    <input type="text" class="form-control mb-2 mr-sm-2" asp-for="PartNumberList" value="@part.PART_NUMBER" id="@part.PART_NUMBER" name="PartNumberList" onchange="HighlightField(this)" />
                    @*The id here is used to determine if the field should be highlighted or not.*@
                    <span class="text-danger" asp-validation-for="PartNumberList"></span>
                    @Model.PartNumberList.Add(part.PART_NUMBER);
                </td> 
                <td class="col-4">
                    <input type="text" class="form-control mb-2 mr-sm-2" asp-for="QuantityList" value="@part.QUANTITY" id="@part.QUANTITY" name="QuantityList" onchange="HighlightField(this)" />
                    @*The id here is used to determine if the field should be highlighted or not.*@
                    <span class="text-danger" asp-validation-for="QuantityList"></span>
                </td>
            </tr>
            }

您会注意到:

@Model.PartNumberList.Add(part.PART_NUMBER);

在那里。我留下来说明我尝试了此方法,但是它引发了一个语法错误,内容为:“无法将类型'void'隐式转换为'object'。”

我只需要能够比较一个旧零件编号列表(我已经拥有)和屏幕上显示的输入字段来检查更改。如果发现更改,则将数据库中存储的部件号更新为该部件号。对于那些想知道为什么所有这些都是必要的人,知道该人在做什么以及为什么的人会在内部100%使用该应用程序。

我不知道是否有正确的位置对字符串列表执行.Add(),或者字符串列表甚至不是执行此任务的正确方法。有关如何完成此任务的任何提示将不胜感激!

谢谢大家,度过美好的一天!

编辑:我忘记提及如果我尝试提交表单(没有上面提到的@Model行)会发生什么。我收到此异常:

InvalidCastException:无法转换类型的对象 键入“ System.Collections.Generic.List`1 [System.String]” 'System.String'。

我想这是因为我只是在不执行.Add()的情况下试图将字符串扔到PartNumberList中。

1 个答案:

答案 0 :(得分:0)

我是偶然发现问题的。我不知道为什么,但是我至少可以告知原因。

问题出在这一行:

Dim conn As OleDbConnection
Dim dta As OleDbDataAdapter
Dim dts As DataSet
Dim excel As String

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Try

        Dim OpenFileDialog As New OpenFileDialog
        With OpenFileDialog
            .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
            .Filter = "All Files (*.*) | *.*"

            If .ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then
                Dim fi As New IO.FileInfo(.FileName)
                Dim FileName As String = .FileName
                excel = fi.FullName
                Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & excel & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"""
                conn = New OleDbConnection(connString)
                dta = New OleDbDataAdapter("Select * from [Sheet1$]", conn)
                dts = New DataSet
                dta.Fill(dts, "[Sheet1$]")
                Dim arrCol0 As Double() = (From myRow In dts.Tables(0).AsEnumerable
                                           Select myRow.Field(Of Double)("[A]")).ToArray
                conn.Close()
            End If
        End With

    Catch ex As Exception
        MsgBox(ex.Message)
        conn.Close()
        Exit Sub
    End Try
End Sub

我评论了一下,突然间一切正常。我的猜测是,它试图将字符串列表转换为字符串以对其进行验证。我将不得不寻找另一种方法来验证我的零件编号列表。