2016-10-15 6 views
0

私はフォームバインドのリストを作成しましたが、フォームを処理するはずですが、コントローラに投稿するときにチェックボックスをfalseクライアントサイドでチェックされていますか?チェックボックスがチェックされても常にfalseにバインドされています。asp.net mvc 5

私のモデル

public class RoleCheckbox 
{ 
    public int id { get; set; } 
    public bool ischecked { get; set; } 
    public string name { get; set; } 
} 

public class UsersNew 
{ 
    public IList<RoleCheckbox> Roles { get; set; } 
    [Required,MaxLength(128)] 
    public string username { get; set; } 
    [Required,DataType(DataType.Password)] 
    public string password { get; set; } 
    [Required,MaxLength(256),DataType(DataType.EmailAddress)] 
    public string email { get; set; } 

} 

クライアントコード

<div class="panel panel-default"> 
    <div class="panel-heading">Roles</div> 
    <div class="panel-body"> 
     <ul class="list-group"> 
      @for (var i = 0; i < Model.Roles.Count; i++) 
      { 
       <li class="list-group-item"> 
        @Html.Hidden("Roles[" +i +"].id",Model.Roles[i].id) 
        <label for="[email protected](i)_ischecked"> 
         @Html.CheckBox("Roles[" +i+ "].id",Model.Roles[i].ischecked) 
         @Model.Roles[i].name 
        </label> 
       </li> 

      } 
     </ul> 
    </div> 
</div> 

私の方法

HttpPost,ValidateAntiForgeryToken] 
    public ActionResult New(UsersNew form) 
    { 

     var user = new User(); 
     syncRole(form.Roles, user.Roles); 

     if (Database.Session.Query<User>().Any(u => u.username == form.username)) 
      ModelState.AddModelError("username", "username must be unique"); 
     if (!ModelState.IsValid) 
      return View(form); 

     user.email = form.email; 
     user.username = form.username; 
     user.SetPassword(form.password); 
     Database.Session.Save(user); 
     return RedirectToAction("index"); 
    } 
+0

あなたのモデルとあなたの投稿方法を表示してください。これはチェックボックスを生成する方法ではありません(そしてあなたの 'id'プロパティは本当に' boolean'ですか?) –

答えて

1

@Html.CheckBox()、好ましい@Html.CheckBoxFor()方法はbool特性への結合のためのものです。それらは、trueの値を持つチェックボックス入力とfalseの値を持つ隠れた入力を生成します。プロパティーidにバインドしようとしていて、trueまたはfalseという値をintにバインドすることはできません。いずれにしても、プロパティidの隠れた入力が既にあるので、チェックボックスの値は無視されます(DefaultModelBinderはプロパティ名と一致する最初のフォーム値のみを読み込みます)。あなたは常にstronlgly型付け***For()メソッドを使用して、boolプロパティにあるチェックボックスをバインドするので、そのちょうどそのデフォルト値

をそれのために任意の値を提出することはありませんので、

あなたischeckedの値は常にfalseです。あなたもあなたが使用して、選択した役割のIDを取得することができますPOSTメソッドで@Html.HiddenFor(m => m.Roles[i].name)

を含まない限り、あなたのビューはnameプロパティが提出されないこと

<ul class="list-group"> 
    @for (var i = 0; i < Model.Roles.Count; i++) 
    { 
     <li class="list-group-item"> 
      @Html.HiddenFor(m => m.Roles[i].id) 
      @Html.CheckBoxFor(m => m.Roles[i].ischecked) 
      @Html.LabelFor(m => m.Roles[i].ischecked, Model[i].name) 
     </li> 
    } 
</ul> 

注意する必要があります

IEnumerable<int> selected = model.Roles.Where(x => x.ischecked).Select(x => x.id); 
+0

私はそれを得ました。 – Vondella21

関連する問題