MVC :: Create A Dynamic Field In The Master Page (site.Master)
Oct 10, 2010
I'm starting with ASP.NET MVC (1.0). I have a problem to resolve. I have developed a web applicaton (an application of articles like e-commerce) with a head (logo and menu). I have defined the head (logo and menu) in the Master page (site.master). Now, I must display the number of articles in the head in a field (like the number of articles in the virtual basket in the e-commerce). I can read the number of articles in the data base (in the controller), but i can't integrate it in the master page.
I have a simple SiteMapPath in my master page like below. <asp:SiteMapPath ID="SiteMapPath1" runat="server" SkinID="SiteMap" Visible="true" /><br /> Also I use Web.sitemap and include all static sitemap pages. In my Web.config, I have this: <siteMap enabled="true"/> Currently, many pages uses this static site map for many projects and I'm not supposed to update the master page, but I need to have dynamic site map so that I can add query strings for each navigating pages.
My computer system froze on me, the mouse froze, cntrl-alt-del, did nothing, so I reset it. Did a disk check, and now everything seems fine except for my master Page html code which I was in the middle of editing when it happened. The VB code-behind file is still ok, the designer file still shows ok with all of the controls in it, but I can't get into desgn or source view. It just opens and gives a whole page of hesixecimal code such as as:
I'm trying to create an ASP.NET MVC master page so the site navigation on it will look like this:
Main Menu:Home | About | News Sub Menu: Home_Page1 | Home_Page2
The Sub Menu section should always show sub-menu for the currently selected Main Menu page (on the example above 'Home' page is selected) unless a user hovers the mouse on another Main Menu item (then it shows that item's sub-menu instead).
I'm currently writing a web app in ASP.NET MVC 1.0 (although I do have MVC 2.0 installed on my PC, so I'm not exactly restricted to 1.0) -- I've started with the standard MVC project which has your basic "Welcome to ASP.NET MVC" and shows both the [Home] tab and [About] tab in the upper-right corner. Pretty standard, right? I've added 4 new Controller classes, let's call them "Astronomer", "Biologist", "Chemist", and "Physicist". Attached to each new controller class is the [Authorize] attribute. For example, for the BiologistController.cs
[Authorize(Roles = "Biologist,Admin")] public class BiologistController : Controller { public ActionResult Index() { return View(); } }
These [Authorize] tags naturally limit which user can access different controllers depending on Roles, but I want to dynamically build a Menu at the top of my website in the Site.Master Page based on the Roles the user is a part of. So for example, if "JoeUser" was a member of Roles "Astronomer" and "Physicist", the navigation menu would say:
[Home] [Astronomer] [Physicist] [About]
And naturally, it would not list links to "Biologist" or "Chemist" controller Index page. Or if "JohnAdmin" was a member of Role "Admin", links to all 4 controllers would show up in the navigation bar. Ok, you prolly get the idea... Now for the real question... Starting with the answer from this StackOverflow topic about Dynamic Menu building in ASP.NET, I'm trying to understand how I would fully implement this. (I'm a newbie and need a little more guidance, so please bare with me.) The answer proposes Extending the Controller class (call it "ExtController") and then have each new WhateverController inherit from ExtController.
My conclusion is that I would need to use Reflection in this ExtController Constructor to determine which Classes and Methods have [Authorize] attributes attached to them to determine the Roles. Then using a Static Dictionary, store the Roles and Controllers/Methods in key-value pairs. I imagine it something like this:
public class ExtController : Controller { protected static Dictionary<Type,List<string>> ControllerRolesDictionary; protected override void OnActionExecuted(ActionExecutedContext filterContext) { // build list of menu items based on user's permissions, and add it to ViewData IEnumerable<MenuItem> menu = BuildMenu(); ViewData["Menu"] = menu; } private IEnumerable<MenuItem> BuildMenu() { // Code to build a menu SomeRoleProvider rp = new SomeRoleProvider(); foreach (var role in rp.GetRolesForUser(HttpContext.User.Identity.Name)) { } } public ExtController() { // Use this.GetType() to determine if this Controller is already in the Dictionary if (!ControllerRolesDictionary.ContainsKey(this.GetType())) { // If not, use Reflection to add List of Roles to Dictionary // associating with Controller } } }
Is this doable? If so, how do I perform Reflection in the ExtController constructor to discover the [Authorize] attribute and related Roles (if any) ALSO! Feel free to go out-of-scope on this question and suggest an alternate way of solving this "Dynamic Site.Master Menu based on Roles" problem. I'm the first to admit that this may not be the best approach.
I have a web app that contains 1 master page and a bunch of content pages. One of the content pages is "SysLogin.aspx", which is called from a menu option from the Master Page. When the page is called, the user logs in. However, there is a "Login" button. In the code behind of the Login_Click() event, the the user successfully logs in, they are supposed to be redirected to a "Default.aspx" page and the Main Menu is enabled. Problem is, the app hangs on the redirect statement and it goes to the Catch portion of the Try Catch construct. For some reason, when I examine the exception, it only says "Unable to evaluate expression". Below is my code. My question, other than what I've stated is...should your application be controlled using code in the Master Page or in child pages. My code from the "SysLogin.aspx" is below. It hangs on the highlighted line of code.
Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLogin.Click Try If txtLoginID.Text.Length > 0 Then If txtPassword.Text.Length > 0 Then If dbIO.ValidateUser(txtLoginID.Text, txtPassword.Text) Then Session("LoggedIn") = txtLoginID.Text Session("loggedInOk") = "Y" Response.Redirect("~/Admin/Default.aspx") End If End If End If Catch ex As Exception Master.errMsg = dbIO.DisplayError("btnLogin_Click()", "SysLogin", ex.Message) End Try End Sub
I have a master page containing a tree and 3 dropdown lists. I am populating a context menu on right click of each node, and when clicked on any item of the context menu, it navigates to required pages.
My problem is after navigating to the required page, the selected values from the drop down lists and the selected node from the tree are getting cleared.
I can set the selected values for the dropdown lists by making some properties in master page. But how do i maintain the selected node?
In my content page, i have got the valuepath of the right clicked node.
Or is there any other way than setting the properties in master page?
From the master page of my ASP.NET site I need to set the value of a hidden field in every get and post request and then subsequently read it in the next request.The problem is that in the post request the code works fine but when the client sends a get request I am unable to read the value of the hidden field from teh Master Page. Is the hidden field the proper approach to this and if so how do I read the value set in the hidden field in the subsequent get request. If the hidden field is not the proper approach for this then what else should I use?
I have a label within my master page that is part of our footer. In the footer, we are wanting to display page specific information. So as you make your way around the site, the footer will contain content about that page along with other data that is universa on the entire site.I had a somewhat similar question some time back that i posted here..
http://forums.asp.net/t/1615850.aspx it was for a shopping cart of sorts..
cartct.Text = ShoppingCart.Instance.Items.Count().ToString() + " Items In Cart";
If Label is in master page, you have to use FindControl to get the Label and udpate its text
((Label)Master.FindControl("cartct")).Text=String.Format("{0} Items In Cart",ShoppingCart.Instance.Items.Count() );
once you select another page, you dont have it anymore,If you want to share data across different pages, consider using Session to save Items count.
I seem to be having problems with something that I thought would be simple
I have
[Code].... [Code]....
and I get the error "object not set to an instance of an object" - I have moved it from prerender to load and tryed all sorts of things, but I get the same error.I am just trying to add a literal control to the masterpage from the masterpage code behind
I have a masterpage in that i have few static control , tree and menu , i am generating the tree and menu dynamically , that works fine , after that when i chlick any node, the content page lode perfectly ...but the dynamic control in the master page ( tree and menu )disapper , but all the static control are there , what might be issue , i am generating the tree in master page load event ,
[Code]....
this is my code in page load event , i am using VS2005 , IE 8, windows XP
I have a hidden field (hfUnsaved)in my child page . On keypress of my textbox i am setting the value into the hiddenfield using the following javascript function
[Code]....
On load: txtProject.Attributes.Add("onkeypress", "return Click('a');");
On button click i am removing the value from hidden field as follows:
Wondering if it is possible to access a master page's hidden field (ex. <Input Type="Hidden" ID="TestHiddenField" Value="testValue"/>) From a Content Page's C# Pack CS Page.If it is possible, How do I go about doing so? I have tried:
PreviousPage.Master.FindControl("[TestHiddenField]") but no .Value attribute and no luck in general.
I created a Site.Master page for my website. On the site.Master page I created a header that holds a dropdown list of companies. I was hoping that this dropdown list would be available to all pages, however the first page I made was a page with a grid view. I wanted to use the header dropdown list as one of the parameters to fill the gridview. That option does show up. I have all of the control on that actual page available to bind to, but not the Site.Master page.
I have a VS 2010 and have created some aspx content pages associated with a master page. I want to call a javascript function right when the page loads but am not able to find an onload client side event for these pages which are using asp:content as there only controls. I know that I can put content in them and I have but how do I call the client side onload event from the main content control?
I have a Master Page and on the Master Page I have a Site Map. What I would like to do is when a user logs on deending on the users permission I want to hide some of the Nodes on the Site Map.
The error i get seems to be centered around jquery finding what it's in (window,document, etc.). Right now i'm just trying to implement the jQuery datepicker. the project has a master page, where i placed my script references.
I am using SharePoint Server 2007 + C# + .Net 3.5 + VSTS 2008 + ASP.Net. And I am using collaboration portal template.
I am developing a custom aspx page and put it in _layout folder of a site and I want to apply default.master of the SharePoint site to this aspx page. Any samples about how to achieve this goal?
I want to ask can I use the master page to make a full border to the site for example: [URL] and then put the content inside that, or I just only can use master pages to do headers and footers?
I am feeling that I have terribly wrong somewhere. I was working on a small asp.net app. I have some dynamic themes in the heme folder and have implemented a page base class to load the master page on the fly. The master is having the ContentPlaceHolder like: <asp:ContentPlaceHolder ID="cphBody" runat="server" />
Now I am adding pages that are derived from my base class and added the form elements. I know, Visual Studio has problem showing the page in the design mode. I have a dropdown box and wish to add the event of onselectedindexchange. But it is not working. the page is like this:
How to create create variables/properties in master page, and let sub-pages access them? So my master will have a string property HomeUrl How can any page that uses the master page access this property?