サンプルASP.NET MVC 3アプリケーションを使用しています。私は、私が取り組んでいるプロジェクトのために、HttpWebRequest
を使用してログイン要求を送信することで、APIの概念実証に取り組んでいます。私はJSONとしてデータを提出しており、コンテンツタイプ "application/json"を使用しています。ここでModelStateにすべての必須値が含まれていても、DefaultModelBinderはバインディングモデルではありません(常にnull)
は、私が持っているメソッドです。
[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
は、私が見ることを期待し、すべてのキーと値が含まれていても(例えば辞書 "、{「ユーザー名」=「ユーザ名」が含まれていることですLogOnModelクラスの3つのプロパティである "Password" = "password"、 "RememberMe" = true})、オブジェクトmodel
は、メソッドを呼び出すたびにnullです。
「application/x-www-form-urlencoded」を使用している場合、この問題はありません。私も自分のApplication_Start
方法に
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
を追加ずにとでを試してみました。
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); }
}
あなたが使った '[Api]'属性は何ですか?それは標準ではありません。あなたが書いたカスタムアクションフィルターですか?私はちょうどこの属性なしであなたのコードをテストし、それは完全に正常に働いた。また、なぜASP.NET MVCコントローラのアクションからブール値を返すのですか?彼らはActionResultsを返すべきです。あなたの場合、それはJsonResultになります。 –
興味深い。実際には、Api属性を削除すると問題が解決されるようです。 http://mvcapi.codeplex.com/から来ます。私は今これを受け入れられた答えとして掲示しますが、なぜその属性が問題を引き起こすのかを見ていきます。 –