una propiedades metodos llamar herencia ejercicios ejemplos crear como clases clase atributos agregar c# asp.net-mvc-5 data-annotations

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; } }