DefaultModelBinder не привязывает модель (всегда ноль), хотя ModelState содержит все обязательные значения - PullRequest
1 голос
/ 22 января 2012

Я работаю с примером приложения ASP.NET MVC 3.Я работаю над проверкой концепции API для проекта, над которым я работаю, отправляя запросы входа в систему, используя HttpWebRequest s.Я отправляю данные в формате JSON и использую тип контента "application / json".

Вот мой метод:

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

Проблема в том, что, хотя ModelState содержитвсе ключи и значения, которые я ожидаю увидеть (например, Словарь содержит {"UserName" = "username", "Password" = "password", "RememberMe" = true}, которые являются тремя свойствами класса LogOnModel), объектmodel равно нулю каждый раз, когда я вызываю метод.

У меня нет этой проблемы при использовании "application / x-www-form-urlencoded".Я также пытался с и без добавления

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

к моему Application_Start методу.

Вот код, который я использую дляотправлять запросы по вышеуказанному методу:

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

1 Ответ

1 голос
/ 22 января 2012

Оказывается, удаление атрибута [Api] решило мою проблему.Если кому-то интересно, это пришло из этого URL: http://mvcapi.codeplex.com/

Дело в том, что мы могли использовать методы, которые имели как виды (для нашей веб-страницы), так и результаты JSON (для наших вызовов API).Если у кого-то есть какие-то другие идеи для этого (кроме очевидного if-this-return-view-else-return-json), пожалуйста, не стесняйтесь комментировать ниже, я хотел бы услышать их.

...