Sto cercando di creare un'applicazione utilizzando Blazor e .NET Core 3 con EF Core 3. Ho impostato un modello di database e un'API per utenti (/ api / users) e navigando su questo in Chrome restituisce tutte le entità nel database . Il mio metodo GetJson nel file Razor restituisce comunque null.
Ecco il mio file di codice 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>
}
Il metodo GetJsonAsync sembra restituire null, nonostante i record siano nel database e nonostante il fatto che sono in grado di visualizzare le entità in formato Json passando a / api / users. La mia implementazione di questo è corretta e qualcuno sa come risolvere potenzialmente questo problema?
Modifica: Codice lato server:
[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);
}
}
}
Avere una barra in avanti davanti all'URL è stato corretto in questo momento, quindi nessuna richiesta passerà. Usa invece api/Users/GetUsers
nel tuo client.
Impostare il Tipo di ritorno sull'API su Task<ActionResult<List<User>>>
List<User>
e modificare il tipo di ricezione su List<User>
anziché User[]
.
In questo modo si assicurerà che i tipi di invio e ricezione non corrispondano.
Ho avuto lo stesso problema. Assicurati che la classe che stai tentando di inviare sia una proprietà con getter e setter:
public string Name { get; set; }