我正在通过各种待办事项清单教程学习学习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);
})}
我希望我已经很好地解释了这个问题。让我知道是否还有其他需要!
答案 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);
...
}