Frage

Ich versuche, die folgenden zu tun.

Verwenden Sie den Standardbinder Modell ein Objekt aus Query-String-Werten zu binden.
Wenn das fehlschlägt, ich dann versuchen, das Objekt von Cookie-Werten zu binden.

Allerdings verwende ich DataAnnotations auf diesem Objekt und ich folgende Probleme habe.

  1. Wenn es keine Abfragezeichenfolgeflag Parameter das Bindemittel Standardmodell sind nicht registriert auch alle Validierungsfehler auf Felder aus. Es ist offenbar nicht einmal diese Validatoren feuert, wenn die Immobilie selbst nicht in der Query-String-Sammlung ist. Wie kann ich dieses Verhalten ändern? Ich würde die erforderlichen Felder wie Fehler sein, wenn sie nicht in dem Query-String sind.
  2. Wenn ich die Modellvalidierung Fehler zu tun haben, möchte ich dann aus dem Cookie das Modell laden und dann das Objekt erneut validieren. Ich bin nicht sicher, wie das Modell Bindemittel zu erhalten, ein Objekt zu validieren ich mich bevölkert haben.

Hier ist, was ich habe so weit.

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

Jede Hilfe, wie man richtig, dies zu tun würde sehr geschätzt werden.

War es hilfreich?

Lösung

Nun, löste ich es selbst. Posting hier die Lösung, falls jemand eine Kommentar oder vielleicht gefallen, es zu benutzen.

 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;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top