2012-11-19 10 views
49

(隠しフォームの一部として)とIは、MVC4部位を有する:ViewBag.Test隠された入力の書き込みはなぜですか?true/falseではなくvalue = "value"ですか?

<input name="somefield" type="hidden" value="@ViewBag.Test"/> 

値はtrueあります。フォームフィールドは、フォームの入力パラメータに掲載されています

public ActionResult SomeAction(bool somefield = false, ...) 

しかしsomefieldは常にfalseです。調査時には、私は、ソースコードを持っていることを参照してください。

<input name="somefield" type="hidden" value="value"/> 

しかし、私はこれが動作するために使用を知って。何が起こったのですか、私は何ができますか?

+0

同様の質問:http://stackoverflow.com/questions/13451051/boolean-string-comparison-in-conditional-attribute-with-mvc4-razor-2-returns-u – webdeveloper

+0

もう1つの関連するが異なる今回はnullsです):http://stackoverflow.com/questions/8061647/conditional-html-attributes-using-razor-mvc3 –

+1

あなたがバグとして報告して欲しいです。これは、 '無効化'や 'チェック済み'などのようなものは合理的だが、 '値'は間違っている。 – tvanfosson

答えて

71

この動作は、MVC3とMVC4の間で変更されました。 MVC3では、あなたが持っている場合:

<input name="somefield" type="hidden" someprop="@(SomeBooleanExpression)"/> 

を、それは非常に文字通り記述します。

<input name="somefield" type="hidden" someprop="True"/> 

をしかし、MVC4で、それが「チェックボックス」などのルールに従い、その値は、あなたが得るtrueの場合:

<input name="somefield" type="hidden" someprop="someprop"/> 

、それがある場合falseそれは完全に省略されています

210は、これを回避するには、.ToString()を考慮してください。そして、文字列のルールではなく、ブールルールに従う

<input name="somefield" type="hidden" 
    someprop="@(SomeBooleanExpression.ToString())"/> 

を。

+1

値のプロパティと等号の間にスペースがあると、ブール値が評価され、期待どおりに割り当てられます。 'value = @(someBoolean)'は 'value =' true ''を返します。 'value = @(someBoolean)は' value = "value" 'を返します。 – mcolegro

+0

@mcolegro Aldoには、通常のHTMLブロックよりも '@:'行の動作が異なることに注意してください。 –

+0

これは、MVC4でこのような領域を理解していると思うようになったときに、このようなことに悩まされました。しかし、この答えをありがとう、私はなぜそれが簡単にこれを解決するために "真" toLower() "ではなく、" True "にデフォルトを取得しません。 – eaglei22

関連する問題