简体   繁体   English

MVC4 Web API后参数为空

[英]MVC4 Web API Post Parameter Null

Web API Post parameters are always Null Web API Post参数始终为Null

ASP.NET Web API POST parameter is null ASP.NET Web API POST参数为null

What worked for these folks, doesn't seem to be working for me. 对这些人有用的东西似乎对我没有用。 I have almost exactly the same setup but still getting null in my second controller. 我的设置几乎完全相同,但第二个控制器中仍然没有输入。 The first one works just fine, but I can't replicate it in a second controller. 第一个可以正常工作,但是我不能在第二个控制器中复制它。

API Call API调用

$.ajax
({
    type: "POST",
    url: "http://localhost:52441/api/login",
    data: { "Username": "test", "Password": "ptest" }
})
.done(function (data) {
    //var json = $.parseJSON(data);
    console.log(data);
});

Controller class 控制器类

public class LoginController : ApiController
{
    public bool Post([FromBody]Creds creds)
    {
        return false;
    }
}

Creds class 信用等级

public class Creds
{
    public string Username { get; set; }
    public string Password { get; set; }

    public Creds(string user, string pass)
    {
        this.Username = user;
        this.Password = pass;
    }
}

Like I said, this works inside of another controller (UsersController). 就像我说的那样,这可以在另一个控制器(UsersController)内部工作。 When I pass { "First_Name": "John", "Last_Name": "Doe" } I properly receive a User object in the Post method public void Post([FromBody]User user) 当我通过{ "First_Name": "John", "Last_Name": "Doe" }我在Post方法public void Post([FromBody]User user)正确接收了一个User对象

What am I missing here? 我在这里想念什么?

Try with the modified code below: 尝试使用以下修改后的代码:

API Call: API调用:

$.ajax
({
    type: "POST",
    url: "http://localhost:52441/api/login/validate",
    data: { "Username": "test", "Password": "ptest" }
})
.done(function (data) {
    //var json = $.parseJSON(data);
    console.log(data);
});

Controller class: 控制器类:

public class LoginController : ApiController
{
    [HttpPost]
    public bool Validate(Creds creds)
    {
        return false;
    }
}

Creds class: 信用等级:

Unchanged. 不变

Follow the below Code 请遵循以下代码

Web API Controller class Web API控制器类

   public class LoginController : ApiController
        {
            public bool Validate([FromUri]Creds creds)
            {
                return false;
            }
        }

Creds class 信用等级

public class Creds
{
    public string Username { get; set; }
    public string Password { get; set; }

    public Creds(string user, string pass)
    {
        this.Username = user;
        this.Password = pass;
    }
}

Either Use API Ajax call in the following manner 通过以下方式使用API​​ Ajax调用

var RequestZipCode = { Username: "test", Password: "ptest" };
            $.ajax({
                type: "GET",
                data: Creds,
                url: "api/Name of the Controller/",
                contentType: "application/json",
                success: function (data){
                    ShowData(data);
            }
            });

Create a client application that will call webapi in the following manner 创建将以以下方式调用webapi的客户端应用程序

StringBuilder sbAPIRequest = new StringBuilder();
 sbAPIRequest.Append("?Username=test");
                sbAPIRequest.Append("&Password=ptest");

                HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(sbAPIRequest.ToString());

                httpWReq.Method = "GET";
                httpWReq.ContentType = "application/json;charset=UTF-8";
                httpWReq.ContentLength = 0;

                HttpWebResponse Httpresponse = (HttpWebResponse)httpWReq.GetResponse();
                string responseString = new StreamReader(Httpresponse.GetResponseStream()).ReadToEnd();

@StephenMuecke had the correct answer for me. @StephenMuecke为我提供了正确答案。 It was because my class had a parameterless constructor. 这是因为我的班级有一个无参数的构造函数。

I needed to do this to my Creds class 我需要在我的Creds班上这样做

public class Creds
{
    public string Username { get; set; }
    public string Password { get; set; }

    public Creds()
    {
        this.Username = string.Empty;
        this.Password = string.Empty;
    }

    public Creds(string user, string pass)
    {
        this.Username = user;
        this.Password = pass;
    }
}

Big thank you to @StephenMuecke 非常感谢@StephenMuecke

You don't have to create a model to take multi post parameters. 您无需创建模型即可采用多个发布参数。 You can use dynamic object instead. 您可以改用动态对象。

[HttpPost]
public SomeObject GetSomeObject([FromBody] dynamic postData) {
    var a = postData.[property name];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM