Pregunta

Estoy tratando de hacer lo siguiente.

Utilice la carpeta de modelo por defecto para enlazar un objeto a partir de los valores de cadena de consulta.
Si eso no funciona, entonces me trato de vincular el objeto a partir de los valores de cookie.

Sin embargo, yo estoy usando DataAnnotations sobre este objeto y estoy teniendo los siguientes problemas.

  1. Si no hay parámetros de cadena de consulta del ligante modelo por defecto ni siquiera se registra cualquier error de validación en los campos requeridos. Al parecer, ni siquiera disparar estos validadores si la propiedad en sí no está en la colección cadena de consulta. ¿Cómo puedo cambiar este comportamiento? Me gustaría que los campos necesarios para ser errores si no están en la cadena de consulta.
  2. Si tengo errores de validación de modelos, me gustaría a continuación, cargar el modelo de la cookie y luego revalidar el objeto. No estoy seguro de cómo obtener el ligante modelo para validar un objeto que he poblada mí mismo.

Esto es lo que tengo hasta ahora.

    public class MyCarBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var myCar = base.BindModel(controllerContext, bindingContext);

        if (!bindingContext.ModelState.IsValid)
        {
            myCar = MyCar.LoadFromCookie();
            // Not sure what to do to revalidate
        }

        return myCar;
    }
}

Cualquier ayuda sobre cómo hacerlo correctamente esto sería muy apreciado.

¿Fue útil?

Solución

Bueno, lo resolví yo mismo. La publicación de la solución aquí por si alguien tiene un comentarios quizá para utilizarlo.

 public class MyCarBinder : DefaultModelBinder
 {
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var queryStringBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new QueryStringValueProvider(controllerContext),
            ModelState = new ModelStateDictionary()
        };

        var myCar = base.BindModel(controllerContext, queryStringBindingContext);

        if (queryStringBindingContext.ModelState.IsValid)
            return myCar;

        // try to bind from cookie if query string is invalid
        var cookieHelper = new Helpers.ControllerContextCookieHelper(controllerContext);
        NameValueCollection nvc = cookieHelper.GetCookies(Helpers.CookieName.MyCar);

        if (nvc == null)
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }

        var cookieBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new NameValueCollectionValueProvider(nvc, CultureInfo.InvariantCulture),
            ModelState = new ModelStateDictionary()
        };

        var myCarFromCookie = base.BindModel(controllerContext, cookieBindingContext);

        if (cookieBindingContext.ModelState.IsValid)
        {
            MyCar temp = myCarFromCookie as MyCar;
            if (temp != null)
                temp.FromCookie = true;

            return myCarFromCookie;
        }
        else
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top