MVCでよく見られるように、私はView、Model、Controllerを持っています。アップデート受信するModelState.IsValidは常にtrueです
public class UserAdminUserViewModel
{
[Display(Name = "User Database ID"), DataType(DataType.Text)]
public string Id { get; set; }
[Display(Name = "Full Name")]
public string Name { get { return FirstName + " " + LastName; } }
[Required()]
[Display(Name = "First Name"), DataType(DataType.Text)]
public string FirstName { get; set; }
[Required()]
[Display(Name = "Last Name"), DataType(DataType.Text)]
public string LastName { get; set; }
[Required()]
[Display(Name = "Email Address"), DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Display(Name = "Telephone Number"), DataType(DataType.Text)]
public string PhoneNumber { get; set; }
}
とコントローラ:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(m => m.Id)
<ul class="fieldlist">
<li>
@Html.LabelFor(m =>m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
</li>
<li>
<div class="row">
<div class="col-md-6">
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
<div class="col-md-6">
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
</div>
</li>
<li>
@Html.LabelFor(m => m.PhoneNumber)
@Html.TextBoxFor(m => m.PhoneNumber)
@Html.ValidationMessageFor(m => m.PhoneNumber)
</li>
<li>
<div Class="row">
<div Class="col-md-2">
<input type="submit" value="Save" />
</div>
</div>
</li>
</ul>
}
モデルは次のようになります。
ビューでは、フォームが含まれてい
[HttpPost,ValidateAntiForgeryToken]
public ActionResult User(UserAdminUserViewModel model)
{
if (ModelState.IsValid)
{
// do something, apply the updates to the database, presumably
}
return View(model);
}
を...しかしにModelState .IsValidは、常にです。コントローラは入力された情報を受け取ったですが、確認は行われていないようです。私が試してみました:
TryUpdateModel<UserAdminUserViewModel>(model);
と
UpdateModel<UserAdminUserViewModel>(model);
を私はこれらがうまくいく方法を見てわからないんだけど、彼らは私が出会った最初の提案でした。サイコロはありません。 「モデル」のデータに関係なく有効です。私も試しました:
System.ComponentModel.DataAnnotations.Validator.ValidateObject(model, new System.ComponentModel.DataAnnotations.ValidationContext(model));
さらに有望ですが、まだ動作しません。私はまた、より冗長なアプローチを試みました:
System.ComponentModel.DataAnnotations.ValidationContext valContext = new System.ComponentModel.DataAnnotations.ValidationContext(model, null, null);
List<System.ComponentModel.DataAnnotations.ValidationResult> valResults = new List<System.ComponentModel.DataAnnotations.ValidationResult>();
System.ComponentModel.DataAnnotations.Validator.TryValidateObject(model, valContext, valResults, true);
foreach(System.ComponentModel.DataAnnotations.ValidationResult result in valResults)
{
this.ModelState.AddModelError(result.MemberNames.FirstOrDefault() ?? string.Empty, result.ErrorMessage);
}
...また動作しませんでした。モデルの状態にエラーが含まれるはずの 'valResults'は決して満たされません。検証は行われていません。
jquery.validate、jquery.unobtrusive、jquery.validate.unobtrusiveは、そのフォームのスコープのどこかに含まれていますか? –
愚かなことだけど、間違ったデータも渡してテストしていますか? –
誤った電子メールアドレスを故意に入力しています。 – Tom