Bonjour,
Asp .Net 6.0 MVC
J'enregistre des articles (commerce), et parmi les propriétés des articles, je voudrais que soit aussi enregistré l'id de l'user qui a créé l'article.
Un User peut créer plusieurs articles.
J'ai pensé faire ça dans ma classe 'Articles' :
Avec pour le contexte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class Articles { public long Id { get; set; } public string Nom { get; set; } public string Description { get; set; } public string Categorie { get; set; } etc... etc... public virtual ApplicationUser User { get; set; } }
Cela a créé une clé étrangère dans la table 'Articles'. C'était satisfaisant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 modelBuilder.Entity<Articles>() .HasOne(n => n.User) .WithMany(a => a.Articles) .OnDelete(DeleteBehavior.Cascade);
Je pensais, jusqu'à ce que je finisse mon formulaire de création d'article et que je le teste, que l'id de l'utilisateur actuellement connecté allait automatiquement s'ajouter dans l'enregistrement de l'article dans la BdD.
Or, pas du tout.
Une erreur me disait que Userid était null.
J'ai ensuite récupéré ID du User dans mon contrôleur pour l'envoyer à ma vue de création d'article (en remplissant un champ masqué).
La vue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public class ArticlesController : Controller { private readonly LeCContext _context; private readonly IHttpContextAccessor _httpContextAccessor; public ArticlesController(LeCContext context, IHttpContextAccessor httpContextAccessor) { _context = context; _httpContextAccessor = httpContextAccessor; } public IActionResult AjoutArticle() { ViewBag.CategoryId = TrouveCategorie().Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.Nom }).ToList(); //https://code-maze.com/aspnetcore-get-current-user-claims/ string monid = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier); ViewData["User"] = monid; return View(); } [HttpPost] public IActionResult AjoutArticle(Articles article) { _context.Articles.Add(article); _context.SaveChanges(); return RedirectToAction("AjoutArticle"); } }
Ça ne fonctionne pas non plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <div class="form-group" hidden> <label asp-for="User" class="control-label">User</label> <input asp-for="User" class="form-control" value=@ViewData["User"] /> <span asp-validation-for="User" class="text-danger "></span> </div>
Erreur : UserId est Null
L'appli va chercher cette valeur ailleurs.
Je ne sais pas ce que je pourrais lui donner comme valeur.
Comment faire comprendre à l'appli que 'User' de ma table 'Articles', c'est l'identifiant du User qui est actuellement connecté : un User de la table 'AspNetUsers' de Identity ?
Depuis j'ai vu sur le net quelqu'un ne pas s’embêter avec cette relation entre les tables, et entrer l'Id de User simplement en string.
Aucun doute qu'en 'string' ça fonctionnera, mais je trouve beaucoup plus logique que la relation soit établie entre les tables 'Articles' et 'AspNetUser'.
Ne serait-ce que pour l'effet 'cascade', très important.
Si un user est supprimé, tous ses articles aussi.
En fait, je n'ai pas bien compris ce qu'est ce "public virtual ApplicationUser User" (qui permet pourtant d'établir, comme je le souhaite, une relation de clé étrangère entre mes tables)
Toute aide sera la bienvenue,
Merci
Partager