. NET Основной HTTP POST с отсутствующими параметрами модели - PullRequest
0 голосов
/ 04 августа 2020

У меня есть класс с именем Server

public class Server
{
    [Key]
    public int Id { get; set; }
    public string ServerName { get; set; }
    public string ServerUrl { get; set; }
    public int ServerIndex { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }

    [NotMapped]
    public string SID { get; set; }
}

В моем контроллере сервера у меня есть функция HTTP post

[HttpPost]
public Server Add(Server server)
{
    return _serverService.Add(server);
}

Когда мой JSON выглядит следующим образом (значение SID равно отсутствует), он не выполняет указанную выше функцию.

{
  "serverIndex": 0,
  "serverName": "string",
  "serverUrl": "string",
  "username": "string",
  "password": "string"
}

Если я создаю новую модель с именем SeverPostModel без SID и использую ее в контроллере, она работает. Есть ли способ использовать ту же существующую модель. Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 04 августа 2020
[HttpPost]
    public Server Add([FromBody]Server server)
    {
        return _serverService.Add(server);
    }

Вы пробовали использовать FromBody?

0 голосов
/ 04 августа 2020

Возможно, проблема связана с методом, который вы используете для отправки данных в метод действия. И, пожалуйста, проверьте, правильный ли URL-адрес запроса? Лучше опубликовать связанный код, чтобы воспроизвести проблему.

На основе вашего кода и описания я создаю образец на своей стороне и использую форму отправки и метод JQuery для передачи данных в действие метод, оба они хорошо работают на моей стороне.

Используйте метод отправки формы для передачи данных:

Код в контроллере:

    [HttpGet]
    public IActionResult Add()
    {   
        return View();
    }

    [HttpPost]
    public Server Add(Server server)
    {
        return server;
    }

Код в представлении :

@model Test.Models.Server

@{
    ViewData["Title"] = "Add";
}

<div class="row">
    <div class="col-md-4">
        <form asp-action="Add">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="ServerName" class="control-label"></label>
                <input asp-for="ServerName" class="form-control" />
                <span asp-validation-for="ServerName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ServerUrl" class="control-label"></label>
                <input asp-for="ServerUrl" class="form-control" />
                <span asp-validation-for="ServerUrl" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ServerIndex" class="control-label"></label>
                <input asp-for="ServerIndex" class="form-control" />
                <span asp-validation-for="ServerIndex" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Username" class="control-label"></label>
                <input asp-for="Username" class="form-control" />
                <span asp-validation-for="Username" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Password" class="control-label"></label>
                <input asp-for="Password" class="form-control" />
                <span asp-validation-for="Password" class="text-danger"></span>
            </div>

            <div class="form-group">
                <label asp-for="SID" class="control-label"></label>
                <input asp-for="SID" class="form-control" /> 
                <span asp-validation-for="SID" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" id="btnSubmit" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

После нажатия кнопки «Отправить» данные формы будут отправлены методу действия (проверьте свой код, чтобы убедиться, что значение атрибута действия правильное и значение имени элемента правильное).

снимок экрана, как показано ниже (если удалить элемент SID, он также передает данные методу действия Post):

enter image description here

If use JQuery code to submit the form data, code like this:

 $ (function () {$ ("# btnSubmit"). click (function () {event.preventDefault (); // предотвращаем событие кнопки отправки по умолчанию. var server = {}; // создаем объект и получаем введенные данные server.ServerName = $ ("input [name = 'ServerName']"). val (); se rver.ServerUrl = $ ("вход [имя = 'ServerUrl']"). val (); server.ServerIndex = $ ("вход [имя = 'ServerIndex']"). val (); server.Username = $ ("вход [имя = 'Имя пользователя']"). val (); server.Password = $ ("ввод [имя = 'Пароль']"). val (); server.SID = $ ("вход [имя = 'SID']"). val (); $. ajax ({type: "POST", url: "/ Home / Add", data: server, success: function (data) {console.log (data)}, failure: function (response) {console. журнал (response.responseText);}, ошибка: функция (ответ) {console.log (response.responseText);}}); }); });  

Результат примерно такой (если удалить элемент SID, он все равно работает):

введите описание изображения здесь

0 голосов
/ 04 августа 2020

Возможно, вы что-то потеряете.

  1. Если вы используете https, а не http, ваш клиент HttpPost должен отключить проверку SSL. Не делайте этого в процессе производства .... Просто отлаживайте !!

    Как Postman, в Settings->General->SSL certificate verification->set Off

  2. Ваша функция для получения параметра HttpPost с [FromBody] атрибут, например:

[HttpPost]
public Server Add([FromBody] Server server)
{
    return server;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...