J'ai ViewModel qui a un modèle et quelques propriétés supplémentaires. Il y a validation sur le modèle et sur la propriété, mais une fois exécutées, seules les validations sur Modèle sont vérifiées, la validation dans la propriété est ignorée.ASP.NET MVC La validation du modèle ne fonctionne pas sur ViewModel
Le modèle:
[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; }
}
Le 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;
}
}
Le contrôleur
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);
}
}
La vue
@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" />
}
Si je soumets le formulaire en laissant le mot de passe vide, il laissera passer. Si je laisse vide les champs du client, il affiche les erreurs (sauf le champ mot de passe)
Cela semble logique et peut m'aider à le réparer. Je vais faire la validation des autres propriétés dans le contrôleur par séparé jusqu'à trouver la meilleure solution pour utiliser la validation du modèle pour ce cas. Merci beaucoup. – Nestor
Comment rendre la vue pour passer un ViewModel au contrôleur de poste? Je l'avais déjà essayé et montre une erreur "nullable parameter" puisque le formulaire reçoit le ViewModel mais quand il revient, il le décompose vers chaque modèle dans le ViewModel pour qu'il ne puisse pas correspondre à la signature sur le contrôleur, et le contrôleur Le paramètre ViewModel, qui me force dans Post Controller, à obtenir chaque modèle comme paramètre séparé au lieu d'un seul paramètre pour le ViewModel. – Nestor
@Nestor, pour que la vue passe un ViewModel à un contrôleur, vous pouvez inclure un '