2011-11-14 18 views
14

私は、チェックボックスで、かなりまっすぐ進むページを作成しました:MV3重複クエリ文字列値(真ブール値はfalse)

@using (Html.BeginForm("MyController", "MyAction", FormMethod.Get)) 
{ 
    @Html.CheckBoxFor(x => x.MyCheckBox) 
    <input type="submit" value="Go!" />  
} 

URLは二回MyCheckBox値が移入されました!?そのように:

MyAction?MyCheckBox=true&MyCheckBox=false 

このチェックボックスがオンの場合、値は重複しません。 falseに設定すると、クエリ文字列に1回だけ表示されます。

私はいくつかのドロップダウンとフォーム上のテキストボックスをうまく動作させるので、上のコードは単純化されています。私はこの質問から除外したコードについては珍しいことはないと思います。

クエリ文字列パラメータが重複していると、誰かに同様の問題がありましたか?

答えて

14

この動作は、チェックボックスコントロールの仕様です。チェックされていない場合、標準のHTMLチェックボックスコントロールは値を渡しません。これは直感的ではありません。代わりに、ASP.Netチェックボックスコントロールには2つの要素があり、表示される標準コントロールと 'False'の値を持つ隠しコントロールがあります。

したがって、チェックボックスをオフにすると、1つの値、つまりFalseが渡されます。
チェックされている場合、TrueFalseの2つの値があります。そのため、あなたのコード内で有効性を確認するために、次のコードを使用する必要があります。

bool checkboxChecked = Request.QueryString["MyCheckBox"].Contains("True"); 
+2

興味深いものですが、URLのきちんとした点について特にお考えですか?それは、パラメータを2回持っているのがちょっと恥ずかしいですね! – pfeds

+0

それは見苦しいかもしれませんが、あなたのユーザベースの99%がそれを理解しません。あなたが本当にあなたのURLのきちんとした心配をしている場合は、郵便でデータを渡して、フォームの特定のルートを作成することができます。 –

+0

はい、そうです。私はそれをGETのままにして、とてもペタンティックなことを止めます。多くの人に感謝しています。 – pfeds

3

受け入れ答えは、MVCの動作は誤解を招くおそれがあり、最近の開発に私の場合、しかし正しいです。

MVC Html.CheckBox(...)およびは、チェックボックスコントロールと同じIDを持つ 'type = hidden'の余分な入力を生成し、重複するURLパラメータにつながります。私は次のように希望するだけのマークアップを含むことにより、この問題を回避ました:

@if(checkTrue){ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox" checked="checked"> 
}else{ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox"> 
} 

は、より良い値チェックがカプセル化されているので、MVCのコードの代わりに使用するヘルパーUPIN包まれるだろう。

私のアプリケーションの一部として、コントローラーは、同じコントローラースコープ内を移動するためにクリックされたときに状態(ページング/フィルターコントロールなど)を保持するために、ヘルパーを使用するフォームインジェクションとリンクインジェクションの両方を使用して、この機能の結果として、標準のMVCヘルパーが使用されている場合、チェックボックス要素は常にfalseに戻されます。これは私が気づいた、そしてこのバグに多くの時間を無駄にしていない良いことです。私のモデルでは

+3

あなたの発言が間違っています。ASP.NET MVCは、CheckBoxForヘルパーを使用しているときに_hidden_​​ではなく_text_である余分な入力を生成します。 http://stackoverflow.com/questions/2697299/asp-net-mvc-why-is-html-checkbox-generating-an-additional-hidden-input – janv8000

+0

@ janv8000を参照してください。あなたは正しいです、私は間違いを訂正しました。 – kas

1

が、私はそうのようなチェックボックスのコレクションを持っていた:

正しくバインドするためにすべてを取得するために
public class PrerequisitesViewModel 
{ 
    public List<StudentPrerequisiteStatusViewModel> PrerequisiteStatuses { get; set; } 
} 

public class StudentPrerequisiteStatusViewModel 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 

    public bool IsSelected { get; set; } 
} 

、私は実際にクエリ文字列から値を変換し、次を使用して手動でそれらを解析しなければなりませんでしたコード:

// fix for how MVC binds checkboxes... it send "true,false" instead of just true, so we need to just get the true 
for (int i = 0; i < model.PrerequisiteStatuses.Count(); i++) 
{ 
    model.PrerequisiteStatuses[i].IsSelected = bool.Parse((Request.QueryString[$"PrerequisiteStatuses[{i}].IsSelected"] ?? "false").Split(',')[0]); 
} 

悲しいかな、それは動作しますが、これはMVCで必要と思われません!うまくいけば、他の誰かがもっと良い解決策を知っていることでしょう。

+0

私は同意する、それはMVCで不必要である!アクティブなチェックボックスの区切られたリストを有するクエリ文字列は、例えば、 mycheckboxlist = 1,5,6,10 – andrew

関連する問題