c# - MVC abstract ViewModel, retener los atributos de validación(dinámicamente)



asp.net-mvc attributes (0)

con suerte me falta algo obvio, pero tengo un problema con algún código que he escrito, y no me siento como si hubiera escrito mi código correctamente.

Entonces, digamos que tengo el siguiente modelo:

public class SampleViewModel {
    [Required]
    public string Property1 { get; set; }
    [Required]
    [EmailAddress]
    public string Property2 { get; set; }
    public IList<AbstractModel> Items { get; set; }
}

Y luego tengo este modelo de vista abstracta:

public abstract AbstractModel {
    [Required(ErrorMessage = "This field is required")]
    public virtual string Value { get; set; }
}

Y estos modelos de vista concretos:

public ConcreteModel1 : AbstractModel { }
public ConcreteModel2 : AbstractModel { }

Dentro de mi controlador, tengo el siguiente código (esto se está haciendo en otro lugar, pero para esta muestra, está bien):

var model = new SampleViewModel();
var fields = new List<AbstractModel>() {
    new ConcreteModel1() { Value = model.Property1 },
    new ConcreteModel2() { Value = model.Property2 },
};
model.Fields = fields;
return View(model);

Dentro de la vista parcial de SampleViewModel (ya que tengo una para cada tipo de modelo de vista), tengo lo siguiente:

@model SampleViewModel
@for(var i = 0; i < Model.Items; i++) {
    @Html.EditorFor(m => Model.Items[i])
}

Digamos que también tengo una vista parcial distinta (con requisitos de diseño muy diferentes) por cada modelo abstracto.

Ejemplo para ConcreteModel1:

@model ConcreteModel1
@Html.TextboxFor(m => m.Value)

Y para el ConcreteModel2:

@model ConcreteModel2
@Html.DisplayFor(m => m.Value)

Todo esto funciona, pero como he tenido que pasar las propiedades de ViewModel (Property1) al AbstractModel, he perdido la conexión entre la vista y el modelo subyacente. Pude volver a vincular los campos de formulario al modelo, utilizando una Carpeta de modelo personalizada, pero lo principal que me faltan son los validadores de modelo que se han agregado a la clase SampleViewModel.

Idealmente, quiero que esta información esté disponible para AbstractModel. La validación está ocurriendo, pero solo obtengo una validación básica del cliente (a través del atributo Valor requerido de AbstractModel), pero me gustaría poder pasar las necesidades de validación de SampleViewModel al AbstractModel.

Expectativa

Lo que realmente me gustaría que ocurra es que la propiedad Value de AbstractModel suplante a la propiedad que se le pasa, de modo que solo actúa como un proxy para el modelo original, pero acaba de remodelar el SampleViewModel (o específicamente su Property1) propiedad).

Entonces, lo importante es considerar la siguiente creación de mis campos:

var fields = new List<AbstractModel>() {
    new ConcreteModel1() { Value = model.Property1 },
    new ConcreteModel2() { Value = model.Property2 },
};

¿Cómo saben los AbstractModels que se supone que sus valores son: obligatorios, y también obligatorios y una dirección de correo electrónico, en función de las propiedades que se utilizan para crearlos?

Gracias por su aporte.





abstract