Overriding css Style on aspx page with master page - css

I have a aspx web page using a master page.
There is a style.css sheet which is a global style.
How can I override the style for all the content in the aspx page, but not alter anything else?
so for example something like this in the aspx page
<asp:Content overridestyle = true>
...
</asp:Content>
EDIT
I found something that sort of sort of works, but it removes the style for the entire page, including the content on the masterpage. Is there anyway to do this solution but only for the content in the contentplaceholder?
new protected void Page_PreInit(object sender, EventArgs e)
{
Page.Theme = "";
}

Add the Content place holder in the master page like this under section
<head runat="server">
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"></asp:ContentPlaceHolder>
</head>
in your aspx page,
<asp:Content ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<link href="*****style sheet path****" rel="stylesheet" type="text/css" />
</asp:Content>

Related

HTML rendered incorrectly for dynamic HTML content using master page

I have a content page which has some dynamic HTML and some static HTML. This dynamic HTML is assigned to a hidden variable in page load.
Content page HTML
<asp:HiddenField id = "hid" runat="server"></asp>
CS of content page
protected void Page_Load(object sender, EventArgs e)
{
hid.Value = node1.InnerText;
}
This content page has master page. Below is its page directive
<%# Page Title="" Language="C#" MasterPageFile="~/log.Master"
AutoEventWireup="true" CodeBehind="Log.aspx.cs" Inherits="s.Log"
ValidateRequest="false" %>`
Below is snippet of Content page
<%# Page Title="" Language="C#" MasterPageFile="~/log.Master"
AutoEventWireup="true" CodeBehind="Log.aspx.cs" Inherits="s.Log"
ValidateRequest="false" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:HiddenField id = "hid" runat="server"/>
</asp:Content>`
Now when content page loads, static HTML is loaded inside master page, but dynamic contents are rendered outside master page hence shows wrong rendering.
The point of <asp:HiddenField> is that it is hidden - therefore any information contained within it should be definition never be rendered on the page.
If the contents of the field contain any HTML code that could cause it to break (such as HTML code that hasn't been encoded)... then it's possible that it will show something, but it is highly likely to be incorrect. I think this is what you are seeing.
I'm not entirely sure exactly why you're using the HiddenField, or what you're trying to do with the contents of it, but I would suggest you change the following line...
hid.Value = node1.InnerText;
With...
hid.Value = Server.HtmlEncode(node1.InnerText);

User Controls and JavaScript and Master Pages

Consider the following situation:
There is a master page with a contentPlaceHolder for all javascript...
for speed issuses this section is at the bottom of the page.
my user control generates some javascript that make use of some references in the master page javascript (Jquery library)
so, if my user control is rendered before the master page javascript, it won't work.
and this is my question:
how do I make some javascript code block inside my .ascx file to be rendered to the asp:Content JavaScript in the .aspx page
or maybe my all thinking is worng?
Thanks!
See if this works for you:
Where in the "bottom" of the Master Page? If you move it inside the closing server-side form control and use ClientScript.RegisterStartupScript in your user control, it will inject that script of your control "before the closing <form/> tag" (which will be after your your static script call).
Master Page - right above the closing server-side ASP.Net </form>:
....
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js "></script>
</form>
Content Page (nothing special):
<%# Register src= ....
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
<uc1:jscript_inject ID="jscript_inject1" runat="server" />
</asp:Content>
User Control:
protected void Page_Load(object sender, EventArgs e)
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "foo", #"alert('foo');", true);
}
This is how its rendered (HTML view source in browser):
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js "></script>
<script type="text/javascript">
//<![CDATA[
alert('foo');//]]>
</script>
....
</form>
As advertised, alert('foo'); is below the "pre-defined" jq cdn call....
Cheers useful.
Interestingly this works for Page.ClientScript.RegisterStartupScript but not Page.ClientScript.RegisterClientScriptInclude, and instead the 'include' gets added to the top of the form.

How to resolve Cannot find ContentPlaceHolder error?

Having a "duh" moment trying to implement a new content page
Here's the structure
Master Page
---- Nested Master Page
-------- Nested Master's Content Page
Mark up:
Master Page
<asp:ContentPlaceHolder ID="bodyContent" runat="server">
</asp:ContentPlaceHolder>
Nested Master Page
MasterPageFile="~/Views/Shared/Administrator.Master"
<asp:Content ID="Content2" CotentPlaceHolderID="bodyContent" runat="server">
</asp:Content>
Nested Master's Content Page
MasterPageFile="~/Views/Intervention/InterventionMaster.master"
<asp:Content runat="server" ID="myContent" ContentPlaceHolderID="Content2">
</asp:Content>
Receive error:
Cannot find ContentPlaceHolder 'Content2' in the master page
'/Views/Intervention/InterventionMaster.master', verify content
control's ContentPlaceHolderID attribute in the content page.
What could I be doing wrong?
You don't have ContentPlaceHolder with ID = "Content2". You have only content with such ID. Put another placeholder inside of content with ID="Content2" and then connect with the page content.
Master Page
<asp:ContentPlaceHolder ID="bodyContent" runat="server">
</asp:ContentPlaceHolder>
Nested Master Page
<asp:Content ID="Content2" ContentPlaceHolderID="bodyContent" runat="server">
<asp:ContentPlaceHolder ID="nestedContent" runat="server">
</asp:ContentPlaceHolder>
</asp:Content>
Nested Master's Content Page
<asp:Content runat="server" ID="myContent" ContentPlaceHolderID="nestedContent">
</asp:Content>
A dirty-quick solution would be to bypass the Nested Master Page
from the Nested Master's Content Page
protected void Page_PreInit(object sender, EventArgs e)
{
Master.MasterPageFile = "~/Whatever.Master";
}
Use ID="MainContent"
<asp:Content ID="Content2" ContentPlaceHolder ID="MainContent" runat="server"></asp:Content>
Codeone was close, try using
<asp:Content ContentPlaceHolderID="MainContent" runat="server">

Access master page control from usercontrol of aspx which enclosed in master page

I have a aspx page which enclosed in master page. My aspx page have user control (ASCX) from user control I am opening a pop up in which I want to get master page controls how can I do it.
ASP.NET has internal property for each page 'Master'. From usercontrol you can travese the stack backwards to Usercontrols parent > Page > Master. If the control in master page is outside any contentplace holders, you can get the control using FindControl method. If it is inside any content place holders, you have to traverse to the content place holder and then you can find the control. The example is below.
MASTER
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblVal" runat="server" Text="MasterLabel"></asp:Label>
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
CONTENT PAGE
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<test:uc ID="test" runat="server" />
</asp:Content>
USER CONTROL
<%# Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
USERCONTROL CODE BEHIND
protected void Page_Load(object sender, EventArgs e)
{
MasterPage mstr = this.Parent.Page.Master as MasterPage;
Label1.Text = (mstr.FindControl("lblVal") as Label).Text;
}
In my case the Label in master page is outside content page.

Content control not accessbile from content page?

My content page looks like this:
<%# Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Basket.aspx.cs" Inherits="Basket" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
</asp:Content>
Now, I would like to add some controls dynamically to the content when page loads, so I am trying the following code:
protected void Page_Load(object sender, EventArgs e)
{
Content2. // I want to add controls to it dynamically
}
The problem is that the Content2 control is not visible by the compiler and I am getting error about missing directive or assembly reference.
Any solution?
The reason you can't get a reference to that asp:Content control is because it does not stay around when the page is combined with the masterpage. Basically ASP takes all the controls from inside these asp:Content sections and makes them children of the ContentPlaceholder controls inside the masterpage.
As MSDN says: A Content control is not added to the control hierarchy at runtime. Instead, the contents within the Content control are directly merged into the corresponding ContentPlaceHolder control.
That means that if you want to add more controls to that section, you will have to get a reference to the ContentPlaceholder control in the masterpage and add them to it. Something like:
ContentPlaceHolder myContent = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");
myContent.Controls.Add(??);
Notice you are using the ContentPlaceHolderID value, NOT the ID of the asp:Content section.
I will recommend that you put a placeholder control in content and use it to add controls. For example,
<%# Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Basket.aspx.cs" Inherits="Basket" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
<asp:Placeholder runat="server" ID="Content1Controls" />
</asp:Content>
..
And
protected void Page_Load(object sender, EventArgs e)
{
Content1Controls.Controls.Add(...
}

Resources