私は最近ASP.NETMVC3の学習を始めたばかりで、すでにそのような問題に直面しています。プロジェクトで目立たないクライアント検証を使用しようとしていますが、奇妙なことがあります。コードは次のとおりです。
最初の.cshtmlファイル:
@model Task_2.Models.Worker
@{
ViewBag.Title = "Edit:";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Edit:</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"> </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/CausesValidation/Validation.js")"
type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Worker</legend>
@Html.HiddenFor(model => model.worker_id)
<div class="editor-label">
@Html.LabelFor(model => model.Surname)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Surname)
@Html.ValidationMessageFor(model => model.Surname)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Second_Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Second_Name)
@Html.ValidationMessageFor(model => model.Second_Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Profession)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Profession,
(IEnumerable<SelectListItem>)ViewData["ProfessionList"])
@Html.ValidationMessageFor(model => model.Profession)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Age)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Age)
@Html.ValidationMessageFor(model => model.Age)
</div>
<div class = "display-label">Projects:</div>
<div class="editor-label">
<table>
@foreach (var item in (IEnumerable<string>)ViewData["WorkerTasks"])
{
<tr>
<td>@Html.DisplayFor(modelitem => item)</td>
</tr>
}
</table>
</div>
<div>
@Html.ActionLink("EditTasks", "EditTasks", new { id = Model.worker_id })
</div>
<p>
<input type="submit" value="Save" name="Button_Edit_Worker"/>
</p>
</fieldset>
}
そして、これがそのモデルクラスです。
public partial class Worker
{
public Worker()
{
this.Tasks = new HashSet<Task>();
}
[Key]
public System.Guid worker_id { get; set; }
[RegularExpression(@"[A-ZА-ЯЁ][A-ZА-ЯЁa-zа-яё .()-]*$",
ErrorMessage = "Ошибка! Некорректный ввод!")]
[Required(ErrorMessage = "Ошибка! Введите данные!")]
public string Surname { get; set; }
[RegularExpression(@"[A-ZА-Я][A-ZА-ЯЁЁa-zа-яё .()-]*$",
ErrorMessage = "Ошибка! Некорректный ввод!")]
[Required(ErrorMessage = "Ошибка! Введите данные!")]
public string Name { get; set; }
[RegularExpression(@"[A-ZА-ЯЁ][A-ZА-ЯЁa-zа-яё .()-]*$",
ErrorMessage = "Ошибка! Некорректный ввод!")]
[Required(ErrorMessage = "Ошибка! Введите данные!")]
public string Second_Name { get; set; }
public string Profession { get; set; }
[RegularExpression(@"[0-9]*$",
ErrorMessage = "Ошибка! Введите корректное число")]
[Range(16,100,ErrorMessage = "Ошибка! Введите число от 16 до 100")]
[Required(ErrorMessage = "Ошибка! Введите данные!")]
public int Age { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
}
2番目の.cshtmlファイル:
@model Task_2.Models.Task
@{
ViewBag.Title = "Edit";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Edit:</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/CausesValidation/Validation.js")"
type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Задание:</legend>
@Html.HiddenFor(model => model.task_id)
<div class="editor-label">
@Html.LabelFor(model => model.Tusk_Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Task_Name)
@Html.ValidationMessageFor(model => model.Tusk_Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Date)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Date)
@Html.ValidationMessageFor(model => model.Date)
</div>
@ViewBag.message
@if (ViewBag.source != "null")
{
<div>
@Html.ActionLink("Back to task list of the current worker",
"EditTasks","Worker", new { id = new Guid(ViewBag.source) }, new { })
</div>
}
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
そしてそのためのモデルクラス:
public partial class Task
{
public Task()
{
this.Workers = new HashSet<Workers>();
}
[Key]
public int task_id { get; set; }
[RegularExpression(@"[A-ZА-ЯЁa-zа-яЁ0-9 .:()-]*$",
ErrorMessage = "Ошибка! Некорректный ввод!")]
[Required(ErrorMessage = "Ошибка! Введите данные!")]
public string Tusk_Name { get; set; }
[DataType(DataType.Date)]//, ErrorMessage = "Ошибка! Некорректный ввод!")]
[Required(ErrorMessage = "Ошибка! Введите данные!")]
public System.DateTime Date { get; set; }
public virtual ICollection<Worker> Workers { get; set; }
}
ここからjsファイルを使用しました: MVC3クライアント側の検証がAjax.BeginFormフォームで機能しない
alert("hello");
$(function () {
$('form').submit(function () {
$.validator.unobtrusive.parse($('form')); //added
alert("profit");
if ($(this).valid()) {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
$('#result').html(result);
}
});
}
return false;
});
});
Html.BeginForm()に関する回答から。
したがって、問題は、最初のフォームを送信しようとすると、「こんにちは」と投稿のみを警告することです。サーバー側の検証は正しく機能し、エラーメッセージが表示されますが、alert( "profit")とクライアント全体の検証は完全に無視されます。2番目のフォームは正しく機能し、送信時にクライアント側の検証を実行します。質問は次のとおりです。間違いはどこにあり、クライアント側の検証を正しく機能させるにはどうすればよいですか?