Question

Je suis en train de faire ce qui suit.

Utiliser le modèle de liaison par défaut pour lier un objet à partir des valeurs de chaîne de requête.
Si cela échoue, j'essaie alors et lier l'objet à partir des valeurs de cookie.

Cependant j'utilise DataAnnotations sur cet objet et j'ai les problèmes suivants.

  1. S'il n'y a pas de paramètres querystring le liant modèle par défaut n'enregistre même pas des erreurs de validation sur les champs obligatoires. Il ne semble même pas tirer ces validateurs si la propriété est elle-même pas dans la collection de chaîne de requête. Comment puis-je changer ce comportement? Je voudrais que les champs nécessaires pour être des erreurs si elles ne sont pas dans la chaîne de requête.
  2. Si j'ai des erreurs de validation de modèle, je voudrais alors charger le modèle à partir du cookie, puis revalider l'objet. Je ne sais pas comment obtenir le modèle de liaison pour valider un objet que je me suis peuplé.

Voici ce que j'ai à ce jour.

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

Toute aide sur la façon de faire correctement ce serait grandement apprécié.

Était-ce utile?

La solution

Eh bien, je l'ai résolu moi-même. La solution de poster ici au cas où quelqu'un a un commentaire ou peut vous l'utiliser.

 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;
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top