DefaultModelBinder non de liaison modèle (toujours nul) même si ModelState contient toutes les valeurs requises

StackOverflow https://stackoverflow.com/questions/8956759

Question

Je travaille avec l'exemple d'application ASP.NET MVC 3. Je travaille sur une preuve de concept pour une API pour un projet sur lequel je travaille, en envoyant des demandes de connexion en utilisant HttpWebRequests. Je soumet des données en tant que JSON et j'utilise le type de contenu "Application / JSON".

Voici la méthode que j'ai:

[HttpPost]
[Api]
public bool ApiLogOn(LogOnModel model)
{
    if (ModelState.IsValid && model != null)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            return true;
        }
    }

    return false;
}

Le problème est que même si ModelState Contient toutes les clés et valeurs que je m'attends à voir (par exemple, le dictionnaire contient {"username" = "username", "mot de passe" = "mot de passe", "reemmMe" = true} qui sont les trois propriétés de la classe LogonModel), le objet model est nul à chaque fois que j'appelle la méthode.

Je n'ai pas ce problème lors de l'utilisation de "Application / X-WWW-Form-Urlencoded". J'ai aussi essayé avec et sans pour autant ajouter

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

à mon Application_Start méthode.

Voici le code que j'utilise pour envoyer des demandes à la méthode ci-dessus:

var credentials = new LogOnModel() { UserName = "username", Password = "password", RememberMe = true };
var result = PostData<LogOnModel, bool>(@"url goes here", credentials);

protected R PostData<T, R>(string uri, T postData)
{
    var request = WebRequest.Create(uri) as HttpWebRequest;
    request.Headers.Add("X-Requested-With", X_REQUESTED_WITH_HEADER);
    request.Accept = "application/json";
    request.Method = "POST";
    request.CookieContainer = cookieJar;
    request.ContentType = "application/json";

    var serializerT = new DataContractJsonSerializer(typeof(T));
    var serializerR = new DataContractJsonSerializer(typeof(R));

    if (postData != null)
    {
        using (var stream = request.GetRequestStream())
        {
            serializerT.WriteObject(stream, postData);
        }
    }

    try
    {
        var response = request.GetResponse() as HttpWebResponse;

        if (response.StatusCode == HttpStatusCode.OK)
        {
            using (var stream = response.GetResponseStream())
            {
                var result = (R)serializerR.ReadObject(stream);
                return result;
            }
        }
        else
        {
            return default(R);
        }
    } catch { return default(R); }
 }

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top