Настройка полей частного набора из почтового запроса на бэкэнд-сервере - PullRequest
0 голосов
/ 21 апреля 2019

Я пробираюсь через различные учебные пособия по списку задач, в то время как изучаю реакцию и структуру сущностей. В качестве некоторого фона я пробился, хотя Учебное пособие Microsoft todo list ; хотя я заменил переднюю часть этого с моим собственным передним концом. Все работало нормально, пока я не попытался расширить его и затронуть проблему, которую я опишу ниже.

Я обновил модель EF, добавив в нее частные поля набора для дополнительных преимуществ (становится доступным только для чтения после инициализации и т. Д.). Это показано в коде ниже.

public class TodoItem
{
    public long id { get; private set; }
    public string title { get; private set; }
    public bool IsComplete { get; private set; }

    // Define constructor
    public TodoItem(long newId, string newTitle)
    {
        id = newId;
        title = newTitle;
        IsComplete = false;
    }

    public void ToggleComplete()
    {
        IsComplete = !IsComplete;
    }
}

Последующее действие от контроллера показано ниже. Я включил некоторые распечатки отладки, поскольку они показывают, где поле уже показывает заголовок как ноль. Я считаю, что это раздел кода, с которым я борюсь, и хотел бы знать, какие ошибки я делаю или каковы лучшие практики!

    [HttpPost]
    public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem item)
    {

        // returns null if model field set to private
        System.Diagnostics.Debug.WriteLine("item title: " + item.title); 

        // Create new item passing in arguments for constructor
        TodoItem newItem = new TodoItem(item.id, item.title);

        _context.TodoItems.Add(newItem);
        await _context.SaveChangesAsync();

        return CreatedAtAction(nameof(GetTodoItem), new { id = newItem.id }, newItem);
    }

Метод внешнего интерфейса (js), в котором выполняется запрос на публикацию, показан ниже:

const addTodoMethod = (title) => {   
// Create new item
const item = {
  title: title,
  id: Date.now(),
  isComplete: false,
}

// Update state
const newTodos = [...todos, item];
setTodos(newTodos);

// Can use POST requiest to add to db
axios.post('https://localhost:44371/api/todo/',
            item)
  .then(res=> {
    console.log("Added item. Title: ", title);
})
.catch(function (error) {
  console.log(error);
})}

Надеюсь, я достаточно хорошо объяснил проблему. Дайте мне знать, если что-нибудь еще понадобится!

1 Ответ

1 голос
/ 21 апреля 2019

Я обновил модель EF, добавив в нее частные поля набора для дополнительных преимуществ (становится доступным только для чтения после инициализации и т. Д.).

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

Лучшее, что вы можете сделать сейчас, - это прекратить использование вашей базы данных для ввода данных пользователем и создать класс ViewModel:

public class TodoItemViewModel
{
    public long id { get; set; }
    public string title { get; set; }
    public bool IsComplete { get; set; }
}

public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItemViewModel model)
{
    var item = new TodoItem(item.id, item.title); 
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...