我已经进行了一些搜索,但似乎无济于事。
我的角度看起来像这样,用户名是字符串。
getUser(username = null) {
if (username == null) {
username = this.cookie.getCookieValue("username");
}
console.log(JSON.stringify({ username: username }));
console.log("passing in "+ username);
return this.http.post<User>(this.userBackendUrl + "/user", username, httpOptions).pipe(map(user => {
console.log("Successfully got the user!");
console.log(user);
return user;
}));}
后端方法看起来像
public ActionResult GetUser(string username)
{
我可以使用方法,但后端的用户名字符串始终为null。
根据与请求一起发送字符串的方式,您必须执行以下操作:
以纯字符串形式发送
如果您的username
or字符串在请求中以纯字符串形式发送,如下所示:
"testuser"
然后,可以将[FromBody]
属性添加到string
控制器中的参数,如下所示:
public ActionResult GetUser([FromBody] string username)
{
//...
}
如果未发送您的用户名或字符串,"testuser"
则将变量或字符串传递给JSON.stringify方法,如下所示:
return this.http.post<User>(this.userBackendUrl + "/user", JSON.stringify(username), httpOptions) //...
作为JSON对象发送
如果您的用户名或字符串在请求中作为JSON对象发送,如下所示:
{
username: "testuser"
}
然后,您需要创建一个单独的类(例如DTO GetUserRequest
)tp绑定,该类应如下所示:
public class GetUserRequest
{
public string Username { get; set; }
}
稍后,您可以将模型(您发送的JSON对象)绑定到此类,再次提供[FromBody]
属性和以创建的类作为数据类型的参数,如下所示:
public ActionResult GetUser([FromBody] GetUserRequest user)
{
//...
}
正如Lionel在这里问的那样,我知道两种方法可以绑定多个参数而无需创建额外的类或DTO。
不幸的是,据[FromBody]
我所知,您不能将多个参数绑定。
但是有以下两种方法:
以表单网址编码发送数据
如果您发送经过编码的数据表单网址,则可以将数据/参数与[FromForm]
属性绑定,如下所示:
以表单网址编码发送数据:
username=test&email=test%40gmail.com&created=2018-08-07T15%3A02%3A00.736Z
将数据绑定到[FromForm]
属性:
public ActionResult GetUser([FromForm] string username, [FromForm] string email, [FromForm] DateTime created)
{
//...
}
将数据作为JSON对象发送并与Newtonsoft绑定
另一种方法是使用JObject
Newtonsoft。我认为这种方式不太直观。
您可以将数据作为普通的JSON对象发送,如下所示:
{
"username": "test",
"email": "[email protected]",
"created": "2018-08-07T14:53:54.639Z"
}
然后,您将数据绑定到具有[FromBody]
属性的单个JObject,然后将数据绑定到单独的变量,如下所示:
public void GetUser([FromBody] JObject requestBody)
{
string username = requestBody["username"].ToString();
string email = requestBody["email"].ToString();
DateTime created = requestBody["created"].ToObject<DateTime>();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句