La façon la plus robuste utilise une classe viewmodel de base et de mettre une propriété de chaîne pour contenir chemin de l'image:
classe modèle
public class BaseViewModel
{
public string BackgroundImage { get; set; }
}
_Layout.cshtml
@model BaseViewModel
<!DOCTYPE html>
<html>
<head>
<!-- other styles, meta tags, etc. -->
<style type="text/css">
#body-bg {
background-image: url('@Model.BackgroundImage');
}
</head>
<body>
<!-- body part -->
@RenderBody()
</body>
</html>
Si vous utilisez un chemin relatif (par ex. ~/Images/Selected.png
) au lieu de chemin absolu pour désigner les chemins d'image, utilisez UrlHelper.Content
avec propriété de chaîne comme argument:
#body-bg {
background-image: url('@Url.Content(Model.BackgroundImage)');
}
Aussi ne pas oublier de définir la propriété de chaîne de viewmodel à l'intérieur méthode d'action du contrôleur:
public class HomeController : Controller
{
// other stuff
return View(new BaseViewModel { BackgroundImage = "/path/to/image.png" });
}
NB: vous pouvez utiliser ViewBag
ou ViewData
en plus d'un viewmodel (ils sont tous deux passés automatiquement à la vue), en changeant Model
-ViewBag
/ViewData
:
// View (CSS)
#body-bg {
background-image: url('@ViewBag.BackgroundImage');
}
// Controller
public class HomeController : Controller
{
// other stuff
ViewBag.BackgroundImage = "/path/to/image.png";
return View();
}
Notez que ViewBag
est dynamique, éventuellement une vérification supplémentaire est requise pour empêcher NullReferenceException
d'être lancé lors de l'utilisation de la propriété ViewBag
.
Références:
Passing Data to Views (MS Documentation)
Pass data to layout that are common to all pages
Passing Data to a Layout Page
Vous pouvez utiliser un modèle de vue de base contenant la propriété, ou le transmettre en utilisant 'ViewBag' ou' ViewData' –
Selon la façon dont la manipulation, vous pouvez utiliser un modèle avec une valeur par défaut aussi. (ie '@RenderSection (...)') – axlj