mvc3 scaffolding によって作成された登録フォームがあります。
例えば
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
等々。
ユーザーが個人か会社かを選択できるドロップダウンリストがあります。個人が選択された場合、生年月日などの個人のプロパティがページに読み込まれますが、オプション「会社」を選択した場合、フォームの一部を (jquery .detach() .attach() を使用して) 非表示に切り替えますフォームの外側の div (したがって、値は送信時に投稿されません)
これは、私のカスタム検証とビューモデルでうまく機能します。唯一の問題は、新しく切り替えた要素のjquery検証がないことです.
目立たない jquery 検証を使用したいのですが、ハンドラーを新しいフォーム要素に手動でアタッチするにはどうすればよいですか (または、検証のために dom 全体を再解析します)。
編集: このブログ投稿を確認した後: http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/
コードを更新しようとしました。そこに記述されている JavaScript を含め、フォームの新しく挿入された部分を再解析しようとしました。違いがなかった場合、コードを .remove() および .html() に切り替えて、裸の html を挿入しましたが、何の役にも立ちませんでした。ここに私のスクリプトがあります:
<script>
$(document).ready(function () {
var secretholder = $('#secret_from_holder');
var visibleholder = $('#type_data_holder');
var select = $('select#TypeValueID');
select.change(function () {
var value = $('select#TypeValueID option:selected').val();
switch (value) {
case '1':
var tohide = visibleholder.html();
visibleholder.children().remove();
var toshow = secretholder.html();
secretholder.children().remove();
secretholder.append(tohide);
visibleholder.append(toshow);
$.validator.unobtrusive.parseDynamicContent('div.firm');
break;
case '2':
var tohide = visibleholder.html();
visibleholder.children().remove();
var toshow = secretholder.html();
secretholder.children().remove();
secretholder.append(tohide);
visibleholder.append(toshow);
$.validator.unobtrusive.parseDynamicContent('div.person');
break;
}
});
});
</script>
私が切り替えたフォームの外側にある私の隠し部分は次のとおりです。
<div id="secret_from_holder" style="display: none">
@if (Model.TypeValueID == Constants.Crm.Customer.Types.FIRM_VALUE_ID)
{
<div class="person">
<div class="editor-label">
@Html.LabelFor(model => model.Person.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Person.Name)
@Html.ValidationMessageFor(model => model.Person.Name)
</div>
<div class="clear"></div>
<div class="editor-label">
@Html.LabelFor(model => model.Person.BirthDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Person.BirthDate)
@Html.ValidationMessageFor(model => model.Person.BirthDate)
</div>
<div class="clear"></div>
</div>
}
else
{
<div class="firm">
<div class="editor-label">
@Html.LabelFor(model => model.Firm.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Firm.Name)
@Html.ValidationMessageFor(model => model.Firm.Name)
</div>
<div class="clear"></div>
<div class="editor-label">
@Html.LabelFor(model => model.Firm.BankAccountNumber)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Firm.BankAccountNumber)
@Html.ValidationMessageFor(model => model.Firm.BankAccountNumber)
</div>
<div class="clear"></div>
<div class="editor-label">
@Html.LabelFor(model => model.Firm.Tax)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Firm.Tax)
@Html.ValidationMessageFor(model => model.Firm.Tax)
</div>
<div class="clear"></div>
<div class="editor-label">
@Html.LabelFor(model => model.Firm.EuTax)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Firm.EuTax)
@Html.ValidationMessageFor(model => model.Firm.EuTax)
</div>
<div class="clear"></div>
<div class="editor-label">
@Html.LabelFor(model => model.Firm.TradeNumber)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Firm.TradeNumber)
@Html.ValidationMessageFor(model => model.Firm.TradeNumber)
</div>
<div class="clear"></div>
</div>
}
</div>
私は本当にここで立ち往生しています、助けてください。
(ページロード時に)自動的に解析された部分は常に検証されます(スイッチアウトして再び元に戻った場合でも)が、手動で解析しようとする部分は決して検証されません