2017-01-06 164 views
1

我试图将未知数量的复选框绑定到布尔值列表。 经过几个小时的搜索,我没有找到任何解决方案。Asp.net MVC把复选框数据放在布尔值列表中

这是代码在我看来,培训相关部分:

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

循环工作,但是当我改变了型,如果输入到复选框它给了我这个exeption:

InvalidOperationException异常:意外的'asp-for'表达式结果类型'System.Collections.Generic.List`1 [[System.Boolean,System.Private.CoreLib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e]] for。如果'type'是'checkbox','asp-for'必须是'System.Boolean'类型。

列表我试图把我的数据中包含以下代码:

 private List<bool> _devices; 

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

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

谢谢你的时间!

编辑:我的问题证明很难解释。我正在验证表单并将其绑定到演示模型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>

+0

可能的[MVC 6 Tag Helpers和foreach]重复(http://stackoverflow.com/questions/31903972/mvc-6-tag-helpers-and-foreach) –

+0

'@foreach(Data.GetDevices中的Device d ())'你是从剃刀内部调用执行代码,而不是推动填充数据的模型? –

+0

它不应该是像上的asp-for =“@ d.NameOfBooleanProperty”吗? –

回答

3

原因错误

你的错误是因为你有这个:asp-for="NewRegistration.Devices"。这是无效的,因为标签是类型复选框的输入,因此asp-for期待布尔值,并且您正在向它发送一个布尔值列表。

解决方案

这会为你的设备创建复选框:

@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并将其传递给您的视图。 然后在您的视图中,为AvailableDevices中的每个设备创建一个复选框。注意下面的输入标签的name属性:

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

然后,在后,你将需要访问SelectedDevices属性来找出用户的选择。

此外,您可以创建单独的模型:一个用于发送给用户,一个控制器从用户接收。您传递给您的视图的模型只能有AvailableDevices,并且您在控制器上发布的模型可以有SelectedDevices。 MVC将使用输入标签中的name属性为您绑定它。

+0

我意识到我描述我的问题的方式可能有点混乱。这些设备与列表的输出无关。如果你仍然感兴趣,我添加了完整的代码。 –

+0

你的意思是这些设备与代码的输出无关?您正在使用该列表创建复选框,因此它与它没有任何关系? – CodingYoshi

+0

对不起,我没有得到你的代码!我认为你的代码是我没有正确阅读的解决方案!非常感谢! –