Never needed to do this before but is it possible to dynamically set/change which master page a page is using? Have an old asp.net web forms project which I have created a new bootstrap template for but the boss wants to give people the opportunity to switch on the new one instead of forcing it upon them.
I would recommend you to create a BasePage class than write this method in that class and inherit all of your pages from this class whose master page can be changed dynamically.
public class BasePage: System.Web.UI.Page
{
protected void Page_PreInit(object sender, EventArgs e)
{
try
{
if (conduction1)
this.Page.MasterPageFile = "~/MasterPage.master";
else
this.Page.MasterPageFile = "~/Master.master";
}
catch (Exception ex)
{
}
}
}
And then in your page inherit page from BasePage like this
public partial class _Default:BasePage
The master page is changed only in preint event
protected void Page_PreInit(object sender, EventArgs e)
{
try
{
if (conduction1)
this.Page.MasterPageFile = "~/MasterPage.master";
else
this.Page.MasterPageFile = "~/Master.master";
}
catch (Exception ex)
{
}
}
or
void page_PreInit(object sender, EventArgs e)
{
Page page = sender as Page;
page.MasterPageFile = "string location of masterpage";
}
Related
In am developing a website by using DotNetNuke, module by module.
In a page (tab), I have 3 modules. 2 modules are the same module which are Form modules, however I name it for different name (Section A and Section B).
In my Button modules it involve processing of Section A and Section B how can I pass data from Form Modules with Section A and Section B into Button modules within same page (Tabs)?
For that you need the IModuleCommunicator and the IModuleListener interfaces.
On the module that will send data:
public partial class View : Module1, IModuleCommunicator
{
public event ModuleCommunicationEventHandler ModuleCommunication;
protected void Page_Load(object sender, EventArgs e)
{
try
{
sendDataToOtherModule("This is a test.");
}
catch (Exception ex)
{
Exceptions.ProcessModuleLoadException(this, ex);
}
}
public void sendDataToOtherModule(string valueToSend)
{
ModuleCommunicationEventArgs mcea = new ModuleCommunicationEventArgs();
mcea.Target = "TheOtherModule";
mcea.Value = valueToSend;
ModuleCommunication(this, mcea);
}
}
On the module that will receive the data
But you could use this code in every module and check the Target.
public partial class View : Module2, IModuleListener
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
//module code
}
catch (Exception ex)
{
Exceptions.ProcessModuleLoadException(this, ex);
}
}
public void OnModuleCommunication(object sender, ModuleCommunicationEventArgs e)
{
if (e.Target == "TheOtherModule")
{
Label1.Text = e.Value.ToString();
}
}
}
Add using DotNetNuke.Entities.Modules.Communications on both modules.
I have made a simple web form with some static HTML on the design view, and on the code behind I put on two methods: Page_Load and Page_PreRender as follows:
public partial class SamplePage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.ClearContent();
Response.ClearHeaders();
Response.StatusCode = (int)HttpStatusCode.NotFound;
Respons.Write("Not Found");
Context.ApplicationInstance.CompleteRequest();
}
protected void Page_PreRender(object sender, EventArgs e) // Why does this event get called? Should not the CompleteReqeust()
{ // cause the page to jump directly to the end of events pipeline?
throw new NotImplementedException();
}
}
Moreover, I have read so many Q&As about Response.End() being "ugly", "dangerous", etc, even from MSDN website. But it puzzles me a lot, why if so the Response.Redirect(string) still uses Response.End() internally?
Overriding IHttpHandler's ProcessRequest(HttpContext) in the Page is enough to do the trick.
public partial class SamplePage : System.Web.UI.Page
{
public override void ProcessRequest(System.Web.HttpContext context)
{
if (conditionTrue)
{
context.Response.StatusCode = 404;
context.ApplicationInstance.CompleteRequest();
}
else
{
base.ProcessRequest(context);
}
}
protected void Page_Load(object sender, EventArgs e) // This is not called also :P
{
}
protected void Page_PreRender(object sender, EventArgs e) // Not called now :)
{
throw new NotImplementedException();
}
}
I have an asp page employeeHome.aspx and I have two master pages adminMasterPage.master for Admin login and userMasterPage.master for normal user login as I have 2 types of user login one as Admin and other normal user. And I want to set adminMasterPage.master as a master page for employeeHome.aspx in case of normal user login (just for this page).
How can I do this?
Put your code to change the master page in Page_PreInit event.
protected void Page_PreInit(object sender, EventArgs e)
{
this.MasterPageFile = "MasterPage.master";
}
Put the code at employeeHome.aspx page
protected void Page_PreInit(object sender, EventArgs e)
{
if (Session["empCode"] != null)
{
if (Session["empCode"].ToString() != "0")
{
this.MasterPageFile = Server.MapPath("adminMasterPage.master");
}
}
}
You can change that by having the required master page file specified in the PreInit event, which is a part of the page life cycle..
protected void Page_PreInit(object sender, EventArgs e)
{
this.MasterPageFile = "adminMasterPage.master"; //For Admin
//this.MasterPageFile = "userMasterPage.master"; - For Normal User
}
This worked this way and here what I did as suggest by #Iswanto San and made changes in the path.
protected void Page_PreInit(object sender, EventArgs e)
{
if (Session["IsEmporAdm"].ToString() == "0")
{
this.MasterPageFile = "~/StyleLibrary\\layout\\AdminMaster.Master";
}
else
{
this.MasterPageFile = "~/StyleLibrary\\layout\\UserMaster.Master";
}
}
I am adding a user control dynamically on a page, the user control has a save button that takes data from both user control and page to save in the DB, in the same save method i want to access a method wrriten in the page, so i that mehod had code to rebind the grid kept in the page.
So how can i call a page method in the dynamically added user control?
I was going to suggest creating a base class for your pages, but found an even better way to accomplish this task:
http://www.codeproject.com/Articles/115008/Calling-Method-in-Parent-Page-from-User-Control
Control code:
public partial class CustomUserCtrl : System.Web.UI.UserControl
{
private System.Delegate _delWithParam;
public Delegate PageMethodWithParamRef
{
set { _delWithParam = value; }
}
private System.Delegate _delNoParam;
public Delegate PageMethodWithNoParamRef
{
set { _delNoParam = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void BtnMethodWithParam_Click(object sender, System.EventArgs e)
{
//Parameter to a method is being made ready
object[] obj = new object[1];
obj[0] = "Parameter Value" as object;
_delWithParam.DynamicInvoke(obj);
}
protected void BtnMethowWithoutParam_Click(object sender, System.EventArgs e)
{
//Invoke a method with no parameter
_delNoParam.DynamicInvoke();
}
}
Page code:
public partial class _Default : System.Web.UI.Page
{
delegate void DelMethodWithParam(string strParam);
delegate void DelMethodWithoutParam();
protected void Page_Load(object sender, EventArgs e)
{
DelMethodWithParam delParam = new DelMethodWithParam(MethodWithParam);
//Set method reference to a user control delegate
this.UserCtrl.PageMethodWithParamRef = delParam;
DelMethodWithoutParam delNoParam = new DelMethodWithoutParam(MethodWithNoParam);
//Set method reference to a user control delegate
this.UserCtrl.PageMethodWithNoParamRef = delNoParam;
}
private void MethodWithParam(string strParam)
{
Response.Write(“<br/>It has parameter: ” + strParam);
}
private void MethodWithNoParam()
{
Response.Write(“<br/>It has no parameter.”);
}
}
A custom control inside my Masterpage, Does that can access the main page?
Please help!
This is my code.
namespace TVSSystem
{
public partial class ControlTVS1 : System.Web.UI.UserControl
{
Page abc;
protected void Page_Load(object sender, EventArgs e)
{
abc = this.Page; //Control: I suposse that I can access all controls of my page
}
protected void Image1_Click(object sender, ImageClickEventArgs e)
{
ContentPlaceHolder cph = (ContentPlaceHolder)abc.FindControl("ContentPlacerHolder1");
TextBox txt = (TextBox)cph.FindControl("TextBox1");
Button btn = (Button)cph.FindControl("Button3");
txt.Visible = true;
btn.Visible = true;
}
}
}
Solved.
http://forums.asp.net/t/1000865.aspx/1
You could use the Page property to access the page containing this user control (no matter if you placed it inside a masterpage):
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
var page = this.Page;
...
}
}