DefaultModelbinder non modello di legame (sempre null) anche se ModelState contiene tutti i valori richiesti

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

Domanda

Sto lavorando con l'applicazione ASP.NET MVC 3 di esempio. Sto lavorando a una prova del concetto per un'API per un progetto su cui sto lavorando, inviando le richieste utilizzando HttpWebRequestS. Sto inviando i dati come JSON e sto utilizzando il tipo di contenuto "Applicazione/JSON".

Ecco il metodo che ho:

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

Il problema è che anche se ModelState Contiene tutte le chiavi e i valori che mi aspetto di vedere (ad esempio Dizionario contiene {"nome utente" = "nome utente", "password" = "password", "ricordame" = true} che sono le tre proprietà della classe LogonModel), The oggetto model è nullo ogni volta che chiamo il metodo.

Non ho questo problema quando utilizzo "Applicazione/X-WWW-FORM-Urlencoded". Ho anche provato insieme a e senza Aggiunta

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

al mio Application_Start metodo.

Ecco il codice che sto usando per inviare richieste al metodo sopra:

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

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top