Blog: render user avatar through a null-safe helper

GET /BlogSpot/Details/1 retournait 500 (avec un 500-sur-500 sur
la page d'erreur elle-même) parce que DisplayTemplates
/ApplicationUser.cshtml faisait `var avuri = "/Avatars/" +
Model.UserName + ".s.png"` : avec <Nullable>enable</Nullable>,
Razor émet un null-check implicite sur Model.UserName et lève
NullReferenceException quand l'auteur n'a pas de UserName
posé (donnée héritée, user partiellement initialisé).

- UserDisplayHelpers.AvatarSrc : helper statique pur dans
  Yavsc.Abstract.Identity qui retourne
  YavscConstants.DefaultAvatar pour user null / UserName vide
  ou whitespace, et un path /avatars/<name>.s.png sinon.
- ApplicationUser.cshtml : utilise le helper.
- Tests : 4 cas (null, vide, whitespace, valide) dans
  Yavsc.Org.Tests/NonRegression.

Bonus : le path d'avatar passe de "/Avatars/" (S majuscule,
ne résolvait pas dans le middleware de fichiers statiques) à
YavscConstants.AvatarsPath ("/avatars" minuscule), pour fermer
l'autre trou que centraliser le calcul permettait de fixer
proprement.
This commit is contained in:
Lum 2026-07-11 19:41:09 +01:00
commit bbdcc7f2ad
3 changed files with 104 additions and 1 deletions

View file

@ -0,0 +1,36 @@
namespace Yavsc.Abstract.Identity
{
/// <summary>
/// Helpers Razor-friendly pour rendre un user dans une vue
/// sans exposer le template à des accesseurs nullables qui
/// lèveraient <see cref="System.NullReferenceException"/>.
/// </summary>
public static class UserDisplayHelpers
{
/// <summary>
/// Chemin d'avatar à utiliser pour <paramref name="user"/>
/// dans un display template. Défense contre <c>null</c>
/// (user pas chargé, FK orpheline) et contre un
/// <c>UserName</c> vide (donnée héritée, user partiellement
/// initialisé). Sans cette garde, Razor émet une
/// NullReferenceException dès qu'un accesseur <c>.UserName</c>
/// apparaît dans le template, ce qui remonte en 500 et
/// masque la page d'erreur elle-même.
/// </summary>
/// <remarks>
/// Le path retourné est aligné sur
/// <see cref="YavscConstants.AvatarsPath"/> (minuscule).
/// Les anciens display templates utilisaient "/Avatars/"
/// avec un S majuscule, en désaccord avec le path statique
/// servi par le middleware de fichiers — les images ne
/// résolvaient pas. Centraliser le calcul ici ferme les
/// deux trous.
/// </remarks>
public static string AvatarSrc(IApplicationUser? user)
{
if (string.IsNullOrWhiteSpace(user?.UserName))
return YavscConstants.DefaultAvatar;
return $"{YavscConstants.AvatarsPath}/{user!.UserName}.s.png";
}
}
}