从后端服务器上的发布请求设置私有集字段

时间:2019-04-21 19:54:01

标签: c# asp.net-core

我正在通过各种待办事项清单教程学习学习React和实体框架。作为某些背景,我已经通过Microsoft's todo list todo tutorial了;尽管我已经用自己的前端替换了前端部分。一切正常,直到我尝试扩展它并解决我将在下面概述的问题。

我已经更新了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;
    }
}

来自控制器的发布动作如下所示。我包含了一些调试打印输出,因为这些显示了该字段已经显示标题为null的位置。 我相信这是我正在努力的代码部分,并且想知道我正在犯什么错误或什么是最佳实践!

    [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 个答案:

答案 0 :(得分:1)

  

我已经更新了EF模型,以包括私有集字段以获取更多好处(只有在初始化后才能读取等)。

您所做的事情有两个问题。第一个是模型必须具有无参数的构造函数,第二个是属性必须是公共的,即getter和setter。

您现在可以做的最好的事情就是停止使用数据库实体进行用户输入,并创建一个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); 
    ...
}