Pregunta

Estoy usando la capa de servicio A con un ModelStateWrapper como se muestra aquí.

¿Cuál es la forma correcta de controlar las teclas de error para usar al validar en la capa de servicio para que corresponden a los nombres de entrada en mis puntos de vista?

por ejemplo, tengo el siguiente modelado para un cliente:

public class CustomerViewModel
{
    public string Name { get; set; }
    /*…*/
}

Y la siguiente vista de ViewModel para la vista de algún caso de uso (el usuario puede crear dos clientes en la marcha en este caso de uso ingresando sus nombres):

public class SomeOtherUseCaseViewModel
{
    public CustomerViewModel BuyingCustomer { get; set; }
    public CustomerViewModel SellingCustomer { get; set; }
    /*… */
}

Que uso en la vista como esta:

<!-- … -->
<%: Html.EditorFor(model => model.BuyingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.BuyingCustomer.Name) %>
<!-- … -->
<%: Html.EditorFor(model => model.SellingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.SellingCustomer.Name) %>

En mi servicio al cliente, tengo el siguiente método de validación que se llama al crear el cliente (tenga en cuenta que esta es una clase de cliente diferente, esta es una clase de dominio):

public bool ValidateCustomer(Customer customer)
{
    /* Check if there is another customer with the same name */
    if (/*…*/)
    {
        _validationDictionary.addError(“Name”, “There is another customer with the same name”); //the _validationDictionary holds the ModelStateWrapper
        return false;
    }
}

¿Ves mi problema?

Dependiendo de la vista, el error debe agregarse con la clave “BuyingCustomer.Name” o “SellingCustomer.Name” (o eventualmente habrá dos errores, uno con cada clave) en lugar de solo "nombre"; De lo contrario, el marco no resaltará correctamente los campos y mostrará los errores.

¿Cuál es la forma correcta de resolver esta situación cuidadosamente? No quiero pasar el "prefijo de clave de error" a la capa de servicio, porque esa es una preocupación de la interfaz de usuario y no una preocupación por la capa de servicio (¿verdad?).

¿Fue útil?

Solución

¿Lo tomaría más tarde que consultas el servicio para cualquier error de validación?

Ya sea el servicio de consulta inmediatamente después de la validación, luego reinicie los errores o haga que el método llame a los errores de validación de retorno. Si hace cualquiera de ellos, puede prefijarlos (prefijo (este validationDictionAryObject, string pfx)) un método de extensión para el diccionario, la API no sería tan mala de esa manera. Un segundo método de extensión (Haselerrors ()) para el diccionario haría lo mismo que su regreso booleano

Para el problema que está teniendo solo, tiendo a evitar la consulta del servicio por errores.

Es conveniente que el servicio los recoja a todos, pero luego está agregando estado de error a un servicio que realmente no pertenece, no es que el servicio esté roto, pero un modelo que verificó fue. Si necesita llamar a ese servicio nuevamente (como lo está haciendo) tiene un estado antiguo. Tienes que manejar eso. O eso o de devolución de errores porque después de todo, es un método de validación. Hacer que devuelva los resultados de validación. :)

var errs = service.ValidateCustomer(sellinCustomer);
if (errs.HasErrors()){
   errs.Prefix("SellingCustomer");
   //add to model state dictionary for view here.
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top