モデルといくつかの追加のプロパティがあるViewModelがあります。モデルとプロパティの検証は実行されますが、モデルの検証のみがチェックされ、プロパティの検証は無視されます。ViewModelでMVCモデルの検証が機能しない
モデル:
[MetadataType(typeof(Customer_Validation))]
public partial class Customer
{
}
public class Customer_Validation
{
[Required(ErrorMessage="Please enter your First Name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter your Last name")]
public string LastName { get; set; }
[Required(ErrorMessage = "Sorry, e-mail cannot be empty")]
[Email(ErrorMessage="Invalid e-mail")]
public string Email { get; set; }
}
のViewModel
public class RegisterViewModel
{
public Customer NewCustomer { get; private set; }
[Required(ErrorMessage="Required")]
public string Password { get; private set; }
public RegisterViewModel(Customer customer, string password)
{
NewCustomer = customer;
Password = password;
}
}
コントローラ
public ActionResult Create()
{
Customer customer = new Customer();
RegisterViewModel model = new RegisterViewModel(customer, "");
return View(model);
}
[HttpPost]
public ActionResult Create(Customer newCustomer, string password)
{
if (ModelState.IsValid)
{
try
{
// code to save to database, redirect to other page
}
catch
{
RegisterViewModel model = new RegisterViewModel(newCustomer, password);
return View(model);
}
}
else
{
RegisterViewModel model = new RegisterViewModel(newCustomer, password);
return View(model);
}
}
ビュー
@using (Html.BeginForm())
{
<table>
<tr>
<td>First Name:</td>
<td>@Html.TextBoxFor(m => m.NewCustomer.FirstName)</td>
<td>@Html.ValidationMessageFor(m => m.NewCustomer.FirstName)</td>
</tr>
<tr>
<td>Last Name:</td>
<td>@Html.TextBoxFor(m => m.NewCustomer.LastName)</td>
<td>@Html.ValidationMessageFor(m => m.NewCustomer.LastName)</td>
</tr>
<tr>
<td>E-mail:</td>
<td>@Html.TextBoxFor(m => m.NewCustomer.Email)</td>
<td>@Html.ValidationMessageFor(m => m.NewCustomer.Email)</td>
</tr>
<tr>
<td>Password:</td>
<td>@Html.TextBoxFor(m => m.Password)</td>
<td>@Html.ValidationMessageFor(m => m.Password)</td>
</tr>
</table>
<input type="submit" value="Register" />
}
私はフォームを送信してパスワードを空にしておくと、通過します。私が空白のままにしておくと、顧客フィールドにエラーが表示されます(パスワードフィールドを除く)
それは、ロジックが鳴り、それを修正するのに役立ちます。私はこのケースでモデルバリデーションを使用する最良のソリューションを見つけるまで、コントローラ内の他のプロパティの検証を別々に行います。どうもありがとう。 – Nestor
ビューをViewModelをポストコントローラに渡す方法を教えてください。私は前に試してみましたが、フォームがViewModelを受け取るので、 "nullable parameter"エラーを表示しますが、ポストバックするとViewModel内の各モデルに分割されてポストコントローラのシグネチャと一致しないため、 ViewModelパラメータ。ポストコントローラで、ViewModelの単一のパラメータではなく、個別のパラメータとして各モデルを取得するように強制します。 – Nestor
@Nestor、ViewにViewModelを渡すようにするには、このビューに '