c# - propiedades - Comparar atributo en clase anidada
get y set c# (1)
Quiero reutilizar mi clase de User
en mi UserViewModel
porque es demasiado grande, con demasiadas propiedades.
public class User
{
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[DataType(DataType.Password)]
public string Password { get; set; }
/* ... many other properties */
}
Mi UserViewModel
tiene la propiedad User
y las propiedades ConfirmEmail
y ConfirmPassword
.
public class UserViewModel
{
public User User;
[DataType(DataType.EmailAddress)]
[Compare("User.Email")]
public string ConfirmEmail { get; set; }
[DataType(DataType.Password)]
[Compare("User.Password")]
public string ConfirmPassword { get; set; }
}
Cuando probé [Compare("Password")]
el error es:
La propiedad UserViewModel.Password no se pudo encontrar.
Y con [Compare("User.Password")]
el error es:
La propiedad UserViewModel.User.Password no se pudo encontrar.
¿No hay manera de hacer eso?
EDITAR: LA SOLUCIÓN:
Intenté la respuesta thepirat000 , pero con algunos cambios:
UserViewModel.cs
public class UserViewModel
{
public User User;
public string UserEmail
{
get { return User.Email; }
set { User.Email = value; }
}
[DataType(DataType.EmailAddress)]
[Compare("UserEmail")]
public string ConfirmEmail { get; set; }
}
Usuario / Create.cshtml
En mi opinión en lugar de:
<div class="form-group">
@Html.LabelFor(model => model.User.Email)
@Html.EditorFor(model => model.User.Email)
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.User.Email)
</div>
<div class="form-group pad-top">
@Html.LabelFor(model => model.ConfirmEmail)
@Html.EditorFor(model => model.ConfirmEmail)
@Html.ValidationMessageFor(model => model.ConfirmEmail)
</div>
Cambié model => model.User.Email
a model => model.UserEmail
:
<div class="form-group">
@Html.LabelFor(model => model.UserEmail)
@Html.EditorFor(model => model.UserEmail)
</div>
<div class="form-group">
@Html.ValidationMessageFor(model => model.UserEmail)
</div>
<div class="form-group pad-top">
@Html.LabelFor(model => model.ConfirmEmail)
@Html.EditorFor(model => model.ConfirmEmail)
@Html.ValidationMessageFor(model => model.ConfirmEmail)
</div>
Ahora tanto el lado del cliente como el lado del servidor están validados.
Tal vez un duplicado: atributo MVC3 Compare y propiedades de objetos anidados
Una solución podría ser aplanar las propiedades en su modelo de vista, como:
public class UserViewModel
{
public User User;
public string UserEmail { get { return User.Email; } }
[DataType(DataType.EmailAddress)]
[Compare("UserEmail")]
public string ConfirmEmail { get; set; }
}