Estoy tratando de crear una aplicación usando Blazor y .NET Core 3 con EF Core 3. He configurado un modelo de base de datos y una API para usuarios (/ api / users) y navegando por esto en Chrome devuelve todas las entidades en la base de datos . Sin embargo, mi método GetJson en el archivo Razor devuelve nulo.
Aquí está mi archivo de código Razor:
@page "/"
@using LogicX.Shared
@inject HttpClient Http
<h1>Users</h1>
@functions{
User[] _users;
protected override async Task OnInitAsync()
{
var users = await Http.GetJsonAsync<User[]>("/api/users");
_users = users;
}
}
@foreach (var usr in _users)
{
<td>@usr.Username</td>
}
El método GetJsonAsync parece volver nulo, a pesar de que los registros están en la base de datos y a pesar del hecho de que puedo ver las entidades en formato Json navegando a / api / users. ¿Es correcta mi implementación de esto y alguien sabe cómo solucionar este problema?
Editar: Código del lado del servidor:
[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class UsersController : Controller
{
private readonly LogicXDbContext _context;
public UsersController(LogicXDbContext context)
{
_context = context;
}
// GET: api/Users
[HttpGet]
public async Task<ActionResult<IEnumerable<User>>> GetUsers()
{
return await _context.Users.ToListAsync();
}
// GET: api/Users/5
[HttpGet("{id}")]
public async Task<ActionResult<User>> GetUser(int id)
{
var user = await _context.Users.FindAsync(id);
if (user == null)
{
return NotFound();
}
return user;
}
// PUT: api/Users/5
[HttpPut("{id}")]
public async Task<IActionResult> PutUser(int id, User user)
{
if (id != user.Id)
{
return BadRequest();
}
_context.Entry(user).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/Users
[HttpPost]
public async Task<ActionResult<User>> PostUser(User user)
{
_context.Users.Add(user);
await _context.SaveChangesAsync();
return CreatedAtAction("GetUser", new { id = user.Id }, user);
}
// DELETE: api/Users/5
[HttpDelete("{id}")]
public async Task<ActionResult<User>> DeleteUser(int id)
{
var user = await _context.Users.FindAsync(id);
if (user == null)
{
return NotFound();
}
_context.Users.Remove(user);
await _context.SaveChangesAsync();
return user;
}
private bool UserExists(int id)
{
return _context.Users.Any(e => e.Id == id);
}
}
}
Tener una barra diagonal delante de la url tiene errores ahora, por lo que no se procesarán solicitudes. Utilice api/Users/GetUsers
en su cliente en su lugar.
Establezca el Tipo de retorno en la API en Task<ActionResult<List<User>>>
y cambie el tipo de recepción a List<User>
lugar de User[]
.
Hacer esto asegurará que los tipos de envío y recepción no coincidan.
Tuve el mismo problema. Asegúrese de que la clase que está intentando enviar es una propiedad con captadores y establecedores:
public string Name { get; set; }