首页 > 解决方案 > Razor Pages:从页面获取字符串列表到页面模型中

问题描述

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

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

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

这是我提到的字符串列表。它在构造函数中初始化。

[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”类型。

我想这是因为我只是试图将字符串放入 PartNumberList 而不执行 .Add()。

标签: c#asp.netstringarraylistrazor-pages

解决方案


我发现了这个问题,纯属偶然。我不知道为什么,但我至少可以告知是什么。

问题出在这一行:

[StringLength(48, MinimumLength = 1, ErrorMessage = "Please enter a part number.")]

我将其注释掉,突然一切正常。我的猜测是它试图将字符串列表转换为字符串以验证它。我必须找到另一种方法来验证我的零件编号列表。


推荐阅读