【问题标题】:DefaultModelBinder not binding model (always null) even though ModelState contains all required values即使 ModelState 包含所有必需的值,DefaultModelBinder 也不绑定模型(始终为空)
【发布时间】:2025-12-07 00:40:01
【问题描述】:

我正在使用示例 ASP.NET MVC 3 应用程序。通过使用HttpWebRequests 发送登录请求,我正在为我正在处理的项目的 API 进行概念验证。我以 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 包含我希望看到的所有键和值(例如 Dictionary 包含 { "UserName"="username", "Password"="password", "RememberMe"=true }是LogOnModel类的三个属性),每次调用方法时对象model都是null。

我在使用“application/x-www-form-urlencoded”时没有这个问题。我也尝试过 withwithout 添加

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

【问题讨论】:

  • 您使用的[Api] 属性是什么?那不是标准的。它是您编写的一些自定义操作过滤器吗?我刚刚测试了没有此属性的代码,它工作得非常好。另外,为什么要从 ASP.NET MVC 控制器操作返回布尔值?他们应该返回 ActionResults。在你的情况下,这将是一个 JsonResult。
  • 有趣。实际上,删除 Api 属性似乎确实解决了问题。它来自mvcapi.codeplex.com。我暂时将其作为已接受的答案发布,但我将研究为什么该属性会导致问题。

标签: c# asp.net-mvc-3 defaultmodelbinder value-provider


【解决方案1】:

事实证明,删除 [Api] 属性解决了我的问题。如果有人感兴趣,它来自这个网址:http://mvcapi.codeplex.com/

关键是我们可以使用同时具有视图(用于我们的网页)和 JSON 结果(用于我们的 API 调用)的方法。如果有人对此有任何其他想法(除了明显的 if-this-return-view-else-return-json),请随时在下面发表评论,我很想听听。

【讨论】:

    最近更新 更多