目立たないクライアント側の検証を有効にすることができます。次のスクリプト参照を追加することから始めます。
<script type="text/javascript" src="@Url.Content("~/scripts/jquery.validate.unobtrusive.js")"></script>
その後:
@model _1.Areas.Admin.Models.AdminModule
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" }))
{
@Html.LabelFor(i => i.MyName)
@Html.TextBoxFor(i => i.MyName)
@Html.ValidationMessageFor(i => i.MyName)
<p id="getDateTimeString"></p>
<input type="submit" value="Click here" />
}
<script type="text/javascript">
$('#myForm').submit(function () {
if ($(this).valid()) {
$.post(this.action, $(this).serialize(), function(data) {
$('#myForm').html(data);
$('#myForm').removeData('validator');
$('#myForm').removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse('#myForm');
});
}
return false;
});
</script>
アップデート:
実際のコードをメールで送っていただいたので、非常に多くの問題があることがわかりました。それらすべてを検討する代わりに、すべてをゼロから完全に書き直すことを好みます。
したがって、次のことから始め~/Areas/Admin/Views/Shared/_LayoutPage1.cshtml
ます。
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<div>
<ul>
<li>@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)</li>
</ul>
@RenderBody()
</div>
<script src="/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>
@RenderSection("Scripts", required: false)
</body>
</html>
すべてのスクリプトをファイルの最後に移動し、カスタム スクリプトを配置する専用のセクションを追加したことに注目してください。
次に、 に移動します~/Areas/Admin/Views/Admin/Index.cshtml
。
@model _1.Areas.Admin.Models.AdminModule
@{
ViewBag.Title = "Index";
Layout = "~/Areas/Admin/Views/Shared/_LayoutPage1.cshtml";
}
<div id="formContainer" data-url="@Url.Action("Index_partial", "Admin", new { area = "Admin" })"></div>
<input id="BTN" type="button" value="Button" />
@section Scripts {
<script type="text/javascript" src="@Url.Content("~/areas/admin/scripts/myscript.js")"></script>
}
このボタンは送信するフォームに含まれていないため、ボタンのタイプを から に置き換えましたsubmit
。また、あなたが持っていbutton
た要素を取り除きました。これは役に立たないだけでなく、無効なマークアップである DOM で重複した ID になってしまいました。また、コンテナー div で HTML5 属性を使用して、フォームをロードするサーバー側スクリプトの URL を示しました。そして、このファイルで最後に行ったのは、レイアウトで以前に定義したセクションをカスタム スクリプトでオーバーライドすることでした。<p>
id="myForm"
data-url
scripts
次の部分はカスタム スクリプトです: ~/areas/admin/scripts/myscript.js
:
$('#BTN').click(function () {
var $formContainer = $('#formContainer');
var url = $formContainer.attr('data-url');
$formContainer.load(url, function () {
var $form = $('#myForm');
$.validator.unobtrusive.parse($form);
$form.submit(function () {
var $form = $(this);
if ($form.valid()) {
$.post(this.action, $(this).serialize(), function (data) {
$form.html(data);
$form.removeData('validator');
$form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse($form);
});
}
return false;
});
});
return false;
});
ここではかなり標準的なコードです。ボタンのクリック イベントをサブスクライブし、AJAX 呼び出しを使用してパーシャルを読み込みます。これが完了するとすぐに、目立たない検証フレームワークに、新しく追加されたコンテンツを DOM に解析するように指示します。.submit
次のステップは、イベントをサブスクライブしてフォームを AJAXify することです。また、success
ハンドラーではコンテナーのコンテンツを再度置き換えるため、目立たない検証フレームワークに新しいコンテンツを解析するよう指示する必要があります。
最後にパーシャル:
@model _1.Areas.Admin.Models.AdminModule
@using (Html.BeginForm("Index_partialPost", "Admin", FormMethod.Post, new { id = "myForm" }))
{
@Html.LabelFor(i => i.MyName)
@Html.TextBoxFor(i => i.MyName)
@Html.ValidationMessageFor(i => i.MyName)
<p id="getDateTimeString"></p>
<input type="submit" value="Click here" />
}
ここで、javascript の痕跡を完全に取り除いたことに気付くでしょう。javascript は別のファイルに属します。ビューとは関係ありません。マークアップとスクリプトを混在させないでください。個別のスクリプトを使用すると、動的マークアップが大幅に小さくなるだけでなく、外部スクリプトのブラウザ キャッシュ、縮小化などを利用できます。このパーシャルで気付くもう 1 つのことは、<script>
ノードを削除することです。 jQuery と jQuery.validate スクリプトを参照していた場所。レイアウトですでにそれを行っています。2 回繰り返さないでください。