Pergunta

Eu estou tentando fazer o seguinte.

Use o modelo padrão aglutinante para ligar um objeto a partir de consulta valores de cadeia.
Se isso falhar, então eu tentar vincular o objeto a partir de valores de cookies.

No entanto, estou usando DataAnnotations neste objecto e eu estou tendo os seguintes problemas.

  1. Se não houver parâmetros querystring o fichário de modelo padrão nem sequer registrar quaisquer erros de validação em campos necessários. Ele, aparentemente, nem sequer disparar estes validadores se o próprio imóvel não está na coleção string de consulta. Como posso alterar esse comportamento? Eu gostaria que os campos necessários para ser erros se eles não estão na cadeia de consulta.
  2. Se eu tiver erros de validação de modelo, eu gostaria de, em seguida, carregar o modelo a partir do cookie e depois revalidar o objeto. Não estou certo de como obter o fichário de modelo para validar um objeto Eu me povoada.

Aqui está o que eu tenho até agora.

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

Qualquer ajuda sobre como fazer corretamente isso seria muito apreciado.

Foi útil?

Solução

Bem, eu resolvi eu mesmo. Postando a solução aqui no caso de alguém tem comentários ou gostaria de usá-lo.

 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top