Tengo ViewModel que tiene dentro de un Modelo y algunas propiedades adicionales. Hay validación en el modelo y en la propiedad, pero cuando se ejecuta, solo se verifica la validación en el modelo, se ignora la validación en la propiedad.ASP.NET MVC La validación del modelo no funciona en ViewModel
El Modelo:
[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; }
}
El modelo de vista
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;
}
}
El controlador
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 vista
@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 envío el formulario dejando la contraseña vacía, déjenla pasar. Si dejo vacíos los campos del Cliente, muestra los errores (excepto el campo de contraseña)
Eso suena lógico y puede ayudarme a solucionarlo. Haré la validación de otras propiedades dentro del controlador por separado hasta encontrar la mejor solución para usar la validación del modelo para este caso. Muchas gracias. – Nestor
¿Cómo se hace que la Vista pase un ViewModel al controlador de correos? Lo había intentado antes y muestra un error de "parámetro de nullable" ya que el formulario recibe ViewModel pero cuando se publica, lo descompone en cada modelo dentro del ViewModel, por lo que no puede coincidir con la firma en el controlador posterior, y luego el controlador establece null en el Parámetro de ViewModel, que me obliga en el controlador posterior a obtener cada modelo como parámetro independiente en lugar de un único parámetro para ViewModel. – Nestor
@Nestor, para hacer que una vista pase un ViewModel a un controlador, puede incluir un '