2012-04-27 12 views
0

からリフレッシュされません。私のチェックボックスはdbを更新していますが、更新時には「チェックされた」値はありません。MVC3のチェックボックスがモデル

@Html.CheckBoxFor(model => Model.PriorityOnly, new { id = "chkPriorityOnly" }) Priority Only<br /> 

をそして、これは選択を保存すると、私のhtmlです:

<input type="checkbox" id="chkPriorityOnly" @if(Model.PriorityOnly){<text> checked="checked" </text>}/> Priority Only <br /> 

はその後示唆したように、私が使用

function OnRestrictionsSaveClick() { 

      $.ajax({ 
       type: 'POST', 
       url: '@Url.Content("~/Audience/UpdateRestrictions?audienceID=" + Model.AudienceID)'     
       + '&priorityOnly=' + $('#chkPriorityOnly:checked').val() 
       + '&home=' + $('#chkHome:checked').val() 
       + '&work=' + $('#chkWork:checked').val() 
       + '&cell=' + $('#chkCell:checked').val() 
       + '&text=' + $('#chkText:checked').val() 
       + '&other=' + $('#chkOther:checked').val() , 
       success: function (data) {SaveRestrictionsResponse(data); } 
      }); 
} 
+3

「@ Html.CheckBoxFor(x => x.PriorityOnly)」を実行しないのはなぜですか?また、あなたのモデルで実際に値が真であることを確認しましたか? DBを更新してから別のものを返すかもしれません。 – Tejs

答えて

1

私はこれがあなたの質問に答えるかどうか分からないが、何あなたはJavaScriptでやっていることは間違っていません。

$( "*:checked")セレクタはチェックされたチェックボックスを探します。

意味$( "#chkHome:checked")はチェックボックスがオフの場合はnullを返します。

Uing .val()は、入力の値属性を取得します。 $( "#chkHome:checked")を呼び出します。チェックされている場合、val()は "true"(入力のvalue属性)を返し、そうでない場合はnullを返します。

$( "#chkHome")。is( ":checked")を使用してください(チェックされている場合はtrue、そうでない場合はfalse)。

むしろ使用し、非表示の入力をお持ちでない:

<input type="checkbox" name="chkPriorityOnly" id="chkPriorityOnly" @(Model.PriorityOnly ? "checked=checked" : "") value="true" /> 
<label for="chkPriorityOnly">Priority only</label> 

name属性は、データバインディングの目的のためのモデル(chkPriorityOnly VS EX PriorityOnly。)上のプロパティ名と一致した場合、それはおそらくも良いでしょう。

1

<input id="chkPriorityOnly" name="PriorityOnly" type="checkbox" value="true" /><input name="PriorityOnly" type="hidden" value="false" /> Priority Only<br /> 

そしてここでは、保存の私です

Html.CheckboxForメソッドを使用してみませんか?

@Html.CheckBoxFor(model => model.PriorityOnly) Priority Only<br /> 

あなたがAJAXのセーブを行っている方法は、控えめではありません。あなたはPOSTを指定していますが、クエリー文字列を作成しています。

代わりに、試してみてください。

function OnRestrictionsSaveClick() { 
    $.post({ 
     url: '@Url.Action("UpdateRestrictions", "Audience")', 
     data: $("input:checkbox").serialize(), 
     success: function(data) { SaveRestrictionsResponse(data); } 
    }); 
} 

この方法では、jQueryのは、自動的にすべての値は、チェックボックスをチェックし取得する、あなたのためのPOSTリクエストデータを構築する力仕事を行います。 ではないチェックボックスは送信されないため、UpdateRestrictions()アクションに渡されたビューモデルはデフォルトですべてのブールプロパティを "false"に設定する必要があります(モデルバインダーはチェックされたプロパティを自動的に "true"に設定します)。

また、Url.Actionメソッドを使用して、目的のアクションのURLを生成できます。 URLをアクションにハードコードしないでください。これらのURLを構築するには、常にUrlHelperまたはHtmlHelperルーティング対応の方法のいずれかを使用します。これは、ルーティングテーブルを尊重するため、ビュー内のURLを変更することなく簡単に経路を変更できるためです。

+0

ありがとう、私は上記の私の記事を試して編集しました。私は隠れた偽は正常であり、問​​題ではないと思います。私は残りのコードを投稿します。 –

+0

@SteveJones更新された質問に基づいて私の更新された回答をチェックしてください。 –

+0

非常にクール、ありがとう! –

0

フォームが投稿されると、チェックされたチェックボックスのみが転記されます。そして、そのせいHtml.CheckBoxForの隠れ場があります。チェックボックスがチェックされていない場合、隠しフィールドの偽の値ではなく、何も(隠しフィールドには、チェックボックスと同じ名前を持っているという通知)

の掲載されており、これを試してみてください。

+ '&priorityOnly=' + $('#chkPriorityOnly').val() 

の代わりに、この:

+ '&priorityOnly=' + $('#chkPriorityOnly:checked').val()