2017-01-06 11 views
1

不明な量のチェックボックスをブール値のリストにバインドしようとしています。 検索の時間がたっても、私は解決策を見つけられませんでした。Asp.net MVCチェックボックスのデータをブール値のリストに入れる

これが私の見解では、コードのrelevent一部です:

 @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 =ニュートラル、PublicKeyToken = 7cec85d7bea7798e]]' 'type'が 'checkbox'の場合、 'asp-for'は 'System.Boolean'型でなければなりません。

私は私のデータを入れてみてくださいリストは、次のコードが含まれています

 private List<bool> _devices; 

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

だから私の質問は、私はブールの私のリストにこれらのチェックボックスから値を追加するにはどうすればよいです。私は入力の種類を指定していないとき、私はエラーは表示されませんが、入力の種類はテキストです。これらの入力ボックスで真または偽を入力すると、コードが正常に動作します。しかし、私は、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タグヘルパーとforeach]の可能な複製(http://stackoverflow.com/questions/31903972/mvc-6-tag-helpers-and-foreach) –

+0

'@foreach(Data.GetDevicesのデバイス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に作成します。次に、あなたのコントローラで、ポストに、ユーザーが選択しているかを把握するためにSelectedDevicesプロパティにアクセスする必要があります

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

:以下inputタグのname属性に注意してください。

さらに、別のモデルを作成することもできます.1つはユーザーに送信するモデル、もう1つはコントローラから受信するモデルです。あなたのビューに渡すモデルは、AvailableDevicesを持つことができ、投稿時にコントローラで取得するモデルのサイズはSelectedDevicesです。 MVCは入力タグのname属性を使用してそれをバインドします。

+0

私は私の問題がちょっと混乱しているかもしれないと私は説明しました。デバイスはリストの出力とは何の関係もありません。私はあなたがまだintrested場合は、完全なコードを追加しました。 –

+0

デバイスがコードの出力と何の関係もないことを意味しますか?あなたはチェックボックスを作成するためにリストを使用しているので、どうしたらそれと関係がありませんか? – CodingYoshi

+0

申し訳ありませんがあなたのコードを取得していない!私はあなたのコードはちょうどそれを正しく読んでいないソリューションだと思う!本当にありがとうございます! –

関連する問題