Как я могу передать строку в почтовый запрос в Angular?

Я сделал некоторые поиски, и ничего не помогает.

Мой угловой выглядит так, когда имя пользователя является строкой.

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)
    {

Я могу использовать свой метод, но моя строка имени пользователя в бэкэнде всегда равна нулю.


person Lionel    schedule 07.08.2018    source источник


Ответы (3)


В зависимости от того, как строка отправляется с запросом, вы должны сделать следующее:

Отправлено в виде простой строки

Если ваш username или строка отправляется как простая строка в запросе, как показано ниже:

"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)
{
   //...
}

Несколько параметров без создания дополнительного класса/DTO

Как спросил Лайонел, вот два способа, которыми я знаю, как вы можете привязываться к нескольким параметрам, не создавая дополнительный класс или DTO.

К сожалению, насколько мне известно, вы не можете привязать [FromBody] к нескольким параметрам.

Но есть следующие два пути:

Отправлять данные в виде закодированного URL-адреса формы

Если вы отправляете закодированный URL-адрес формы данных, вы можете связать данные/параметры с атрибутом [FromForm] следующим образом:

Отправьте данные в виде закодированного URL-адреса формы:

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"
}

Затем вы привязываете данные к одному объекту JObject с атрибутом [FromBody], а затем привязываете данные к отдельным переменным, как показано ниже:

public void GetUser([FromBody] JObject requestBody)
{
   string username = requestBody["username"].ToString();
   string email = requestBody["email"].ToString();
   DateTime created = requestBody["created"].ToObject<DateTime>();
}
person adiii4    schedule 07.08.2018
comment
Это не сработало, мне нужно что-то добавить к моему маршруту? Поскольку мой атрибут маршрута выглядит так [Маршрут (пользователь)], а атрибут выглядит так [HtttpPost] - person Lionel; 07.08.2018
comment
Нет, это должно быть правильно, поскольку вы сказали, что можете использовать этот метод. Какого типа переменная имени пользователя в угловом коде (тот, который вы отправляете в почтовом запросе)? Это обычная строка или объект JSON? - person adiii4; 07.08.2018
comment
Это простая строка, здесь я обновлю свой код. - person Lionel; 07.08.2018
comment
Вы используете ASP .NET или ASP .NET Core? - person adiii4; 07.08.2018
comment
Я использую .netcore - person Lionel; 07.08.2018
comment
Я думаю, вы получаете null, потому что ваша строка может быть отправлена ​​​​не так, как вы думаете в запросе. Просмотрите мой обновленный ответ, а также попробуйте проверить, как строка отправляется, возможно, с помощью инструментов разработчика. - person adiii4; 07.08.2018
comment
Спасибо @adiii4, просто любопытно, как я смогу передавать больше данных в будущем? например, void getInfo (имя строки, адрес электронной почты строки) без необходимости создавать объект - person Lionel; 07.08.2018
comment
@ Лайонел Я обновил свой ответ, указав два способа, которыми я знаю, как вы могли бы это сделать. - person adiii4; 07.08.2018

измените свой метод С#, как показано ниже

    [Route("GetUser/{username}")]
    [HttpPost]
    public ActionResult GetUser(string username)
    {
       //code
    }
person Midhun P    schedule 07.08.2018

Отправить как данные формы в Angular:

const formData = new FormData();
formData.append("userName", userName);
return this.http.post<any>(url, formData);

И добавьте FromForm в ASP.NET с тем же именем параметра (userName):

public IActionResult GetUserName([FromForm] string userName) {
person Jose    schedule 04.03.2020