次のコードの予想される動作に注意してください
@Html.RadioButtonFor(x => x.MyEnumProperty, MyEnum.OptionOne)
@Html.RadioButtonFor(x => x.MyEnumProperty, MyEnum.OptionTwo)
@Html.RadioButtonFor(x => x.MyEnumProperty, MyEnum.OptionThree)
は
<input id="MyEnumeration" type="radio" value="Option1"
name="MyEnumeration"
data-val-required="The MyEnumeration field is required." data-val="true">
<input id="MyEnumeration" type="radio" value="Option2" name="MyEnumeration">
<input id="MyEnumeration" type="radio" value="Option3" name="MyEnumeration">
なんで?Html.SomethingFor(model => model.Property)
1 つの特定のプロパティに対して 1 つの html 要素を生成することを意図しているためです。これを使用して 1 つのプロパティから複数の要素を作成する方法は正しくありません。
さらに、これら 3 つのラジオ ボタンの ID を確認します。彼らはかなり同じですよね?HTML ページに同じ ID を持つ要素を含めることは許容されますか? 絶対違う!したがって、何かを修正する必要があります。
この問題は、新しい Html 拡張メソッド (参考文献 2) を開発することで簡単に解決できると思いましたが、別の方法で解決しようとしました (頑固なので)。
まず、かみそりのコードを変更する必要があります。
<div>
@Html.RadioButtonFor(m => m.MyEnumeration, MyEnum.Option1, new { id = "m1" })
<label for="m1">
OPTION 1</label>
@Html.RadioButtonFor(m => m.MyEnumeration, MyEnum.Option2, new { id = "m2" })
<label for="m2">
OPTION 2</label>
@Html.RadioButtonFor(m => m.MyEnumeration, MyEnum.Option3, new { id = "m3" })
<label for="m3">
OPTION 3</label>
</div>
次に、問題を解決するための JavaScript/jQuery マジックの一部:
<script type="text/javascript">
$(function () {
$('[name=MyEnumeration]').each(function (index) { domAttrModified(this); });
});
function domAttrModified(obj) {
//$obj = $(obj);
$(obj).bind('DOMAttrModified', function () {
if ($(obj).attr('class').indexOf('input-validation-error') != -1)
$(obj).parent().addClass('input-validation-error');
else
$(obj).parent().removeClass('input-validation-error');
});
}
</script>
最初のラジオ ボタンで検証エラーが発生するたびに、この JavaScript コードはinput-validation-error
、要素であるラジオ ボタンの親要素にエラー css クラス ( ) を適用します<div>
。
また、(ラジオ ボタン要素のいずれかをクリックして) 検証エラーがなくなると、親要素からエラー スタイルが削除されます。
IE と FF では問題なく動作しますが、残念ながら Chrome では動作しません。DOMAttrModified
理由は、Chrome がイベントをサポートしていないためです。このソリューションを使用して修正できます: https://stackoverflow.com/a/10466236/538387ですが、後で可能性があります。
繰り返しますが、HTML 拡張メソッドを開発するか、次のような EditorTemplate を改善して使用する必要があると思います: https://gist.github.com/973482
参考文献:
- https://stackoverflow.com/a/7098541/538387
- https://stackoverflow.com/a/3448675/538387
- https://gist.github.com/973482
- Jquery を使用して css プロパティが変更されたときのイベント検出