【问题标题】:Asp.net POST parameter always nullAsp.net POST 参数始终为空
【发布时间】:2013-10-02 07:58:14
【问题描述】:

为了传递电子邮件地址,我使用 ajax 和 POST 作为类型。

$.ajax({
    url: "api/Search/UserByEmail",
    type: "POST",
    data: JSON.stringify({ emailAddress: userEmail }),
    contentType: "application/json;charset=utf-8",
    dataType: "json",
    success: function (data) { ... }
});

控制器:

[HttpPost]
public IEnumerable<Object> UserByEmail([FromBody] string emailAddress) { ... }

Fiddler 是这么说的:

POST http://localhost:52498/api/Search/UserByEmail HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/json;charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:52498/#
Accept-Language: de-DE
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Host: localhost:52498
Content-Length: 35
DNT: 1
Connection: Keep-Alive
Pragma: no-cache

{"emailAddress":"mail@example.com"}

为什么 emailAddress 参数总是为空?

【问题讨论】:

  • 这对我来说看起来不错,您是否测试过使用 Fiddler 构建请求并手动发布?最有可能的问题是 JSON 数据,但从这里我看不出它有什么问题。您也可以尝试删除 [FromBody] 属性。
  • 当我取出[FromBody] 时,我的方法甚至没有被调用。这是路由:config.Routes.MapHttpRoute( name: "UserByEmailRoute", routeTemplate: "api/Search/UserByEmail", defaults: new { controller = "Search", action = "UserByEmail" } );
  • 这可能是有道理的,它会期望你在没有那个的情况下发布到api/Search/UserByEmail/emailAddress - 只是试图排除可能导致问题的事情:) 在 Fiddler ,如果您将=mail@example.com 作为正文发布,它会起作用吗?
  • 是的,这行得通。谢谢。

标签: asp.net jquery asp.net-mvc-4


【解决方案1】:
 // JS - jQuery 
 $.ajax({
        url: "/Home/UserByEmail",
        type: "POST",
        data: { emailAddress: "joe@gmail.com" },
        dataType: "json",
        success: function (data) { if(data != null) { alert(data.toString()); } }
    });



  [Serializable]
  public class EmailFormModel {
     public string emailAddress { get; set; }
  }

    [HttpPost]
    public JsonResult UserByEmail(EmailFormModel emailFormModel)
    {
        bool ok = emailFormModel.emailAddress != null;
        return Json(new { ok }); 
    }

使用formModel并在类上放置一个可序列化的属性,它将序列化 您的 javascript 会自动转换为 C# 等效项。而且您不需要使用 Json-stringify。

注意 a 删除了 // contentType: "application/json;charset=utf-8", 来自 ajax 方法的声明。我实际上从未使用过它。

【讨论】:

  • "您不需要使用 JSON.stringify" - 如果您想将数据作为 JSON 传递,您可以这样做...
  • 不,如果你有一个可序列化的类作为你的方法的参数,它会自动将 javascript 对象转换为 C#。而且我自己也用过很多次,很好用!!
  • 是的,虽然您不再使用 JSON,但我想说的一点是 - 数据被转换为查询字符串并附加到 URL。
  • 是的,但它仍然是一个 HTTP POST!
  • 是的,但是就像我说的那样,您不再从客户端发布 JSON,因此 application/json 也必须更改为 application/x-www-form-urlencoded
【解决方案2】:

我认为JSON.stringify 可能是您的问题。 MVC会为你处理参数的序列化/反序列化,改成:

data: { emailAddress: userEmail }

【讨论】:

  • @user2558051 另外,去掉FromBody 属性,我敢肯定你不需要它(我从来没有听说过!)
  • @mattytommo 您通常确实需要 WebAPI 的 [FromBody] 属性...但是,我觉得这也可能是问题所在(请参阅我的评论)。
【解决方案3】:

修改原ajax调用中的data属性为

data: '"' + userEmail + '"',

让其中一些 Web API 调用工作有时可能有点棘手

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 2017-06-07
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多