Динамическое фоновое изображение на теле (ASP.NET)
У меня есть ситуация, когда у меня есть ~ 10-20 различных фоновых изображений в папке. Когда мой сайт загружается, мне нужно выбрать конкретное изображение, основанное на некоторых значениях из базы данных.
Я думал об использовании runat = server в теге body, а затем динамически добавлял атрибуты на page_load, но везде, где я читал это предложение, люди говорят, что это действительно плохая идея...
Кроме того, я попробовал, и это не сработало (но не слишком отлаживало его).
Как это сделать "правильно"?: -)
Ответы
Ответ 1
Вы можете динамически добавить его через общий HTML-элемент управления:
using System.Web.UI.HtmlControls;
protected override void OnInit(EventArgs e)
{
// Define an Literal control.
HtmlGenericControl css = new HtmlGenericControl();
css.TagName = "style";
css.Attributes.Add("type", "text/css");
string imageURL = string.Empty;
//Logic to determin imageURL goes here
//Update Tag
css.InnerHtml = @"body{background-image: url(" + imageURL + ");}";
// Add the Tag to the Head section of the page.
Page.Header.Controls.Add(css);
base.OnInit(e); }
Другой вариант заключается в том, чтобы иметь публично отображаемое свойство из кода
например.
public string backgroundImage = "defaultImage.png";
Обновите это в событиях инициализации или загрузки страницы.
И ссылайтесь на него в файле aspx либо в голове:
<style type="text/css">
body
{
background-image:url(<%=backgroundImage%>);
}
</style>
или как атрибут тега body
<body style="background-image: url(<%= backgroundImage %>)">
Любой из них должен быть в состоянии помочь вам.
Ответ 2
Один из способов сделать это - иметь свойство вроде этого (метод также будет работать):
protected string BodyBackgroundImageUrl
{
get
{
// I just chose random pic
return "http://www.google.com/images/logos/ps_logo2.png";
}
}
Вам не нужно устанавливать значение, подобное этому, вы можете заполнить его позже со страницы Init
.
Затем в теле вы можете сделать что-то вроде:
<body style='background:url(<%= BodyBackgroundImageUrl %>) no-repeat;'>
Нет-повтор - это просто показать, что вы можете писать все, что хотите.
Конечно, у вас может быть больше контроля и разных способов:
public string GetBodyStyle()
{
// Get the picture somehow dynamically
string bodyBackgroundImageUrl = GetBodyBackgroundImageUrl();
// You can use StringBuilder or so, not the main point
var styles = "";
styles += string.Format("background:url({0}) no-repeat;", bodyBackgroundImageUrl);
// ... Add some extra styles if you want ...
return styles;
}
И тогда ваш тег тела будет выглядеть так:
<body style='<%= GetBodyStyle() %>'>
...
Кроме того, вы всегда можете использовать скрытое поле, которое вы назначаете значение со страницы, а затем в браузере задаете фоновый URL-адрес этого скрытого поля JavaScript.
Пример (с использованием jQuery, но вам не обязательно):
$(function() {
// ASP.NET will fill the ID, then # with ID will show to JS as one JS string
var myHiddenField = $('#<%= myServerSideHiddenField.ClientID %>');
var bodyBackground = "url(" + myHiddenField.val() + ")";
document.body.css("background" , bodyBackground);
});
Ответ 3
Вот как мы это делали.
<body runat="server" id="PageBody">
код за
PageBody.Style.Add("background-color", "" + returncolor + "");
Ответ 4
Я использую мастер-страницу и, принимая советы и подсказки из нескольких предложений, я придумал это как лучшее и самое полное решение до сих пор:
Добавьте это с помощью:
using System.Web.UI.HtmlControls;
Внутри MasterPage:
<body runat="server" id="masterPageBody">
В любой функции страницы с кодовым кодом (например, "Page_Load" ):
HtmlControl masterPageBody =(HtmlControl)Master.FindControl("masterPageBody");
masterPageBody.Style.Remove("background-image");
masterPageBody.Style.Add("background-image", "/images/blah.jpg");
Ответ 5
serverPath = Request.PhysicalApplicationPath;
string chosenMap = dropdownlistMap.SelectedItem.Text;
Bitmap bm = new Bitmap(serverPath + chosenMap);
int imageWidth = bm.Width;
int imageHeight = bm.Height;
bm.Dispose();
FileInfo fi = new FileInfo(chosenMap);
string imageSrc = "~/" + fi.Name;
imgPanel.BackImageUrl = imageSrc;
imgPanel.Width = imageWidth + 4;
imgPanel.Height = imageHeight + 4;
imgPanel.BorderColor = Color.Yellow;
imgPanel.BorderStyle = BorderStyle.Groove;
imgPanel.BorderWidth = 2;
Ответ 6
Серьезно - это не должно быть так сложно. Я только что реализовал это для чего-то, что я разрабатываю... Я понимаю, что эта ветка, вероятно, мертва, но эй, я придумал лучшее решение IMO.
ASPX VB:
'////////////////////////////////////////////////////////////////////////////
ClientScript.RegisterStartupScript(Me.GetType, "Фон", "document.body.style.backgroundImage =" и Chr (34) & "url ('128-700.jpg')" и Chr (34) и ";", True)
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Что я... Я называю это прямо из части кода VB. Я все еще участвую, но я знаю, что после поиска и пробования разных вещей это было как можно более прямым.
Уловка - этот код использует вызов Java для изменения фона и изменения CSS.