gpt4 book ai didi

asp.net-core-mvc - Asp.net MVC 将复选框数据放入 bool 值列表中

转载 作者:行者123 更新时间:2023-12-01 17:41:38 26 4
gpt4 key购买 nike

我正在尝试将未知数量的复选框绑定(bind)到 bool 值列表。经过几个小时的搜索,我没有找到任何解决方案。

这是我认为代码的相关部分:

        @foreach (Device d in Data.GetDevices())
{
<label asp-for="NewRegistration.Devices">@d.Name</label>
<input asp-for="NewRegistration.Devices" class="checkbox" type="checkbox" />
}

循环有效,但是当我更改类型时,如果复选框的输入给了我这个异常(exception):

InvalidOperationException: Unexpected 'asp-for' expression result type 'System.Collections.Generic.List`1[[System.Boolean, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]' for . 'asp-for' must be of type 'System.Boolean' if 'type' is 'checkbox'.

我尝试放入数据的列表包含以下代码:

        private List<bool> _devices;

public List<bool> Devices
{
get { return _devices; }
set {_devices = value; }
}

所以我的问题是如何将这些复选框中的值添加到我的 bool 值列表中。当我不指定输入的类型时,我不会收到任何错误,但输入的类型是文本。如果我在这些输入框中输入 true 或 false,我的代码就可以正常工作。但我想要一个复选框,而不是要求用户输入 true 或 false。

感谢您的宝贵时间!

编辑:我的问题很难解释。我正在验证表单并将其绑定(bind)到演示模型 PMRegistration 中定义的注册类的实例。如果代码片段不够清晰,我会将完整代码放在下面

注册类别:

  public class Registration
{

public int Id { get; set; }
[Required(ErrorMessage = "required field")]
[MaxLength(50, ErrorMessage = "To long")]
[DisplayName("Name")]
public string Name { get; set; }
[Required(ErrorMessage = "required field")]
[MaxLength(50, ErrorMessage = "To long")]
[DisplayName("Firstname")]
public string FirstName { get; set; }
[Required(ErrorMessage = "required field")]
[Range(1,110 ,ErrorMessage = "To long")]

public string Age { get; set; }
[Required(ErrorMessage = "required field")]
[EmailAddress(ErrorMessage ="Not a valid email address")]
public string Email { get; set; }
[Required(ErrorMessage = "required field")]
[DisplayName("slot1")]
public int Slot1SessionId { get; set; }
[Required(ErrorMessage = "required field")]
[DisplayName("slot2")]
public int Slot2SessionId { get; set; }
[Required(ErrorMessage = "required field")]
[DisplayName("slot3")]
public int Slot3SessionId { get; set; }


private List<bool> _devices;

public List<bool> Devices
{
get { return _devices; }
set {_devices = value; }
}

[Required(ErrorMessage = "required field")]
[DisplayName("Organization")]
public int OrganizationId { get; set; }
public bool ClosingParty { get; set; }



}

我的观点如下:

        @using week3.Models;
@model week3.Models.PresentationModels.PMRegistration
<div>
<h1>New Registration</h1>
<h2>registration</h2>
</div>
<form class="form-group" asp-controller="Registration" asp-action="New" method="post">
<div>
<label asp-for="NewRegistration.Name">Name:</label>
<input asp-for="NewRegistration.Name" class="form-control" value="@Model.NewRegistration.Name" />
<span asp-validation-for="NewRegistration.Name" class="text-danger"></span>
</div>
<div>
<label asp-for="NewRegistration.FirstName">Firstname:</label>
<input asp-for="NewRegistration.FirstName" class="form-control" value="@Model.NewRegistration.FirstName" />
<span asp-validation-for="NewRegistration.FirstName" class="text-danger"></span>
</div>
<div>
<label asp-for="NewRegistration.Age">Age:</label>
<input asp-for="NewRegistration.Age" class="form-control" value="@Model.NewRegistration.Age" />
<span asp-validation-for="NewRegistration.Age" class="text-danger"></span>
</div>
<div>
<label asp-for="NewRegistration.Email">Email:</label>
<input asp-for="NewRegistration.Email" class="form-control" value="@Model.NewRegistration.Email" />
<span asp-validation-for="NewRegistration.Email" class="text-danger"></span>
</div>
<div>
<div>Pick your sessions</div>
<label asp-for="NewRegistration.Slot1SessionId" class="form-label">Slot1:</label>
<select asp-for="NewRegistration.Slot1SessionId" class="form-control" asp-items="@Model.getSessionNamesBySlot(1)" value="@Model.NewRegistration.Slot1SessionId"></select>
<span asp-validation-for="NewRegistration.Slot1SessionId" class="text-danger"></span>
</div>
<div>
<label asp-for="NewRegistration.Slot2SessionId">Slot2:</label>
<select asp-for="NewRegistration.Slot2SessionId" class="form-control" asp-items="@Model.getSessionNamesBySlot(2)" value="@Model.NewRegistration.Slot2SessionId"></select>
<span asp-validation-for="NewRegistration.Slot2SessionId" class="text-danger"></span>
</div>
<div>
<label asp-for="NewRegistration.Slot3SessionId">Slot3:</label>
<select asp-for="NewRegistration.Slot3SessionId" class="form-control" asp-items="@Model.getSessionNamesBySlot(3)" value="@Model.NewRegistration.Slot3SessionId"></select>
<span asp-validation-for="NewRegistration.Slot3SessionId" class="text-danger"></span>
</div>

<div>are you wearing dangerous accessoires?</div>

@foreach (Device d in Data.GetDevices())
{

<label asp-for="NewRegistration.Devices[0]">@d.Name</label>
<input asp-for="NewRegistration.Devices[0]" class="checkbox" type="checkbox" />
}
<div>
<label asp-for="NewRegistration.OrganizationId">Organization:</label>
<select asp-for="NewRegistration.OrganizationId" asp-items="@Model.getOrganizations()" class="form-control"></select><br />
<span asp-validation-for="NewRegistration.OrganizationId" class="text-danger"></span>
</div>
<div>
<label asp-for="NewRegistration.ClosingParty">Are you coming to the closing party?</label>
<input asp-for="NewRegistration.ClosingParty" />
<span asp-validation-for="NewRegistration.ClosingParty" class="text-danger"></span>
</div>
<input type="submit" class="btn btn-default" value="Register" />
</form>

最佳答案

错误原因

您的错误是因为您有以下内容:asp-for="NewRegistration.Devices"。这是无效的,因为标签是复选框类型的输入,因此 asp-for 需要一个 bool 值,而您正在向它发送一个 bool 值列表。

解决方案

这将为您的设备创建复选框:

@foreach (Device d in Data.GetDevices())
{
@Html.CheckBox(item);
}

但我的假设是您希望用户选择这些复选框,然后将它们发回给您,如果是这种情况,那么您需要这样做:

您需要创建一个如下所示的模型:

public class Device
{
public string Name { get; set; }
}
public class DevicesCollectionModel
{
public List<Device> AvailableDevices { get; set; }
public List<Device> SelectedDevices { get; set; }
}

填充DevicesCollectionModel.AvailableDevices并将其传递到您的 View 。然后在您的 View 中,为 AvailableDevices 中的每个设备创建一个复选框。注意下面 input 标签的 name 属性:

@foreach (var item in Model.AvailableDevices)
{
<div class="checkbox">
<label>
<input type="checkbox"
name="SelectedDevices"
value="@item.Name" /> @item.Name
</label>
</div>
}

然后在 Controller 中,在发布过程中,您需要访问 SelectedDevices 属性来确定用户选择的内容。

此外,您可以创建单独的模型:一个用于发送给用户,另一个由 Controller 从用户接收。您传递到 View 的模型只能具有 AvailableDevices,而您在发布时在 Controller 中获取的模型可以具有 SelectedDevices。 MVC 将使用输入标记中的 name 属性为您绑定(bind)它。

关于asp.net-core-mvc - Asp.net MVC 将复选框数据放入 bool 值列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41511664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com