Отражение для добавления класса css в тег body c # - PullRequest
2 голосов
/ 08 марта 2012

У меня есть мастер-страница с runat = "server" и идентификатором, установленным в теге body.см. ниже

<body id="MasterPageBodyTag" runat="server">  

код позади на главной странице Я добавил следующий код:

    public HtmlGenericControl BodyTag
{
    get { return MasterPageBodyTag; }
    set { MasterPageBodyTag = value; }
}

теперь я хочу добавить класс css в тег body из файла Class1.cs в папке App_code.

На .aspx я передаю элемент управления главной страницы, используя следующий код:

  protected void Page_Load(object sender, EventArgs e)
{
    backend.FindPage((PageTemp)this.Master);

}

Теперь на Class1.cs у меня есть следующее

  public static void FindPage(Control mp)
{

    Page pg = (Page)HttpContext.Current.Handler;


    PropertyInfo inf = mp.GetType().GetProperty("BodyTag");    

}

Я хочу добавить следующее к найденному BodyTag

 //      BodyTag.Attributes.Add("class", "NewStyle");

Но, похоже, не могу найти способ добавить атрибут или привести инфу к HtmlGenericControl.

Anyпомощь была бы отличной.

Ответы [ 3 ]

5 голосов
/ 08 марта 2012

Вместо того, чтобы зависеть от типа мастер-страницы, я бы просто использовал FindControl для поиска элемента body по Id. Если предположить, что тег body находится на главной странице верхнего уровня, а также если вы используете вложенные главные страницы, он будет выглядеть примерно так:

private static MasterPage GetTopLevelMasterPage(Page page)
{
    MasterPage result = page.Master;
    if (page.Master == null) return null;

    while(result.Master != null)
    {
        result = result.Master;
    }

    return result;
}

private static HtmlGenericControl FindBody(Page page)
{
    MasterPage masterPage = GetTopLevelMasterPage(page);
    if (masterPage == null) return null;
    return masterPage.FindControl("MasterPageBodyTag") as HtmlGenericControl;
}

private void UpdateBodyCss()
{
    HtmlGenericControl body = FindBody(this);
    if(body != null) body.Attributes.Add(...);
}

Вы даже можете удалить зависимость от идентификатора, выполнив поиск элемента управления HtmlGeneric с именем тега «body»:

private static HtmlGenericControl FindBody(Page page)
{
    MasterPage masterPage = GetTopLevelMasterPage(page);
    if (masterPage == null) return null;
    foreach(Control c in masterPage.Controls)
    {
        HtmlGenericControl g = c as HtmlGenericControl;
        if (g == null) continue;
        if (g.TagName.Equals("body", StringComparison.OrdinalIgnoreCase)) return g;
    }
    return null;
}
1 голос
/ 08 марта 2012

Вам необходимо добавить следующее в файл aspx:

<%@ MasterType VirtualPath="~/Your_Master_Page.Master" %>

и тогда вы можете сделать на .cs вашей страницы:

Master.BodyTag.Attributes.Add("class", "NewStyle");
0 голосов
/ 08 марта 2012

То, что вы делаете, кажется немного запутанным, и, вероятно, есть более простые способы справиться с этим.

Чтобы ответить на ваш вопрос, вам не нужно использовать рефлексию. Вы можете просто привести передаваемый параметр FindPage к типу главной страницы, который вы создали.

Вы не указали имя типа своей главной страницы, поэтому я дам ей имя MyMasterPage.

Так что FindPage должно выглядеть так:

public static void FindPage(Control mp)
{
    var masterPage = mp as MyMasterPage;
    if (mp != null)
    {
        mp.BodyTag.Attributes.Add("class", "NewStyle");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...