J'essaie de créer une application en utilisant Blazor et .NET Core 3 avec EF Core 3. J'ai configuré un modèle de base de données et une API pour les utilisateurs (/ api / users) et la navigation dans Chrome renvoie toutes les entités de la base de données . Ma méthode GetJson dans le fichier Razor renvoie cependant null.
Voici mon fichier de code 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>
}
La méthode GetJsonAsync semble retourner null, malgré les enregistrements se trouvant dans la base de données et malgré le fait que je puisse voir les entités au format Json en naviguant vers / api / users. Est-ce que ma mise en œuvre est correcte et quelqu'un sait-il comment résoudre ce problème?
Modifier: Code côté serveur:
[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);
}
}
}
Le fait d'avoir une barre oblique devant l'URL est buggé en ce moment, donc aucune demande ne sera traitée. Utilisez plutôt api/Users/GetUsers
dans votre client.
Définissez le type de retour sur l'API sur Task<ActionResult<List<User>>>
et modifiez le type de réception sur List<User>
au lieu de User[]
.
Cela garantira que les types d'envoi et de réception ne correspondent pas.
J'ai eu le même problème. Assurez-vous que la classe que vous essayez d'envoyer est une propriété avec des getters et des setters:
public string Name { get; set; }