2つの可能な解決策がある問題が発生しています。どの解決策が「より正しい」かわかりません。
ページの上に開くモーダルダイアログがあります。このダイアログは、IDが「foo」の要素をホストします。
さて、それ自体はまったく問題ではありません。ただし、非ダイアログページには複数のタブがあります。一部のコンテンツの奥深くにあるこれらの他のタブの1つにも、ID「foo」があります。これにより、DOMツリーをトラバースするときに最初に検出される「foo」に応じて、奇妙で断続的な問題が発生します。
残念ながら、両方の値はまったく同じ方法でまったく同じ情報を示しています。唯一の違いは、ダイアログ内でホストされていることです。同じモデルが使用されているため、ViewModelによって同じIDが生成されています。
私は2つのことのうちの1つをすることができます:
- これらのID作成メソッドの1つを明示的にオーバーライドして、ダイアログで生成されたIDが非ダイアログのIDと比較したときに一意になるようにします。
- jQuery検索セレクターを変更して、ダイアログのフォームから内側にのみ読み取るようにします。ダイアログが予期しないDOM要素をキャプチャしないようにします。
2番目のアイデアがより良い方法のように思われます。トラバースするDOMノードが少なく、何もハッキングする必要はありません。ただし、知らない開発者にとっては、適切な領域から検索を開始しないと、誤ってこの問題が再発生する可能性があります。
ただし、同じ問題は、アプリケーションに取り組んでいるすべての開発者に言えることです。同じIDを作成しないように、ViewModelのID作成をオーバーライドすることを明示的に知る必要があります。
異なる形式でカプセル化されている場合、IDを繰り返すことは許容されますか?IDが一意であるという期待はどこで意味をなさなくなりますか?
IDは、MVCのEditorForHTMLHelperを介して生成されます。フォーム固有のIDを生成するようにこれをオーバーライドできますが、それは明らかにMVCの意図ではありませんでした。
<%= Html.EditorFor(model => model.CustomerDisplayName) %>
更新: IDの一意性を強制する必要があるようです。ただし、ASP.NET MVC3は、IDがDOMに一意であることを確認する簡単な方法を提供していないようです。フォームのIDを追加することはできますが、それによって巨大なIDが生成されます。それが最適な呼び出しかどうかはわかりません。何かご意見は?