MVC - Find Controllers With (Authorize) Attributes Using Reflection In C# Or Build Dynamic Site.Master Menus?
Jun 8, 2010
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.
View 2 Replies
Similar Messages:
Jan 29, 2010
I have a class decorated with a attribute ...[DataEntity("MESSAGE_STAGING", EnableCaching = true, CacheTimeout = 43200)] for some requirement,I want to change this value "MESSAGE_STAGING" at run time to "Test_Message_Staging". What is the best possible way to achieve this? Can i use reflection ,Or is there any other way to do this.
View 3 Replies
Nov 10, 2010
For comparison: something like the shirt builder application at [URL] Say, if I have fabric image and want to generate base, collar, cuff etc. How should I do it on server side in .NET, and generate different components of shirt.
View 1 Replies
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.
View 1 Replies
Feb 3, 2010
So I've eagerly added the System.ComponentModel.DataAnnotations namespace to my model.
I've added things such as:
[Required] [DisplayName("First Name")]
public string first_name {get;set;}
I really like these attributes because they save me from having to write custom T4 and/or modify views heavily. This way, I can regenerate a view confident that it will add the display names I want, etc.
The problem comes in when I started building a DataGrid helper inspired by the one in ASP.NET MVC2 unleashed. In this helper, Stephen uses reflection to get at the column headings.
var value=typeOf(T).GetProperty(columnName).GetValue(item,null) ?? String.Empty;
Well, the trouble is I don't want to retrieve the property name. I want to retrieve the value for the DisplayName attribute.
My first attempt at this was to look inside the Attributes property of the PropertyInfo class. Unfortunately, none of the data annotations show up as an attribute.
Is there a way to retrieve the data annotations using reflection?
View 2 Replies
May 28, 2010
Is there a way to have 2 different menus that have their items populate from 2 separate sitemap datasources?
Currently I have one menu that is populating correctly from one sitemap. I would like to remove some items from this menu and have them in another menu positioned somewhere else on my page. How can I make this second menu populate these items from a seperate datasource?
View 4 Replies
Jan 30, 2010
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.
View 2 Replies
Jul 4, 2010
I have a UserControl which contains a TextBox and a CustomValidator. I would like to set the CustomValidator.ServerValidate to a method in the page that contains the UserControl I found this code which will allow me to dynamically set the custom validators validation function: cusvCustom.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(MethodName);
The problem is that a string value won't work there. It needs to be a reference to the method. Is it possible to use reflection (or some other method) to get a valid reference to the parent controls method using only the string name of it? The reason I want to use the string value of the method name is so I can place the control on the page thusly: <uc1:TextBoxField ID="tbUserName" runat="server" CustomValidationMethod="ValidateUserName" />
WebUserControl.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl.ascx.cs" Inherits="WebApplication1.WebUserControl" %>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Custom Validation Failed" OnServerValidate="CustomValidator1_ServerValidate" />
<asp:TextBox ID="TextBox1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Submit" CausesValidation="true" />
WebUsecControl.ascx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class WebUserControl : System.Web.UI.UserControl
{
public ServerValidateEventHandler Validating;
protected void CustomValidator1_ServerValidate(object sender, ServerValidateEventArgs e)
{
if (Validating != null)
Validating(sender, e);
}
}
}
TestPage.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="WebApplication1.TestPage" %>
<%@ Register Src="~/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:WebUserControl ID="WebUserControl1" runat="server" OnValidating="WebUserControl1_Validating" />
</div>
</form>
</body>
</html>
TestPage.aspx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class TestPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//WebUserControl1.Validating += WebUserControl1_Validating;
}
protected void WebUserControl1_Validating(Object sender, ServerValidateEventArgs e)
{
e.IsValid = false;
}
}
}
I did some research and I found Type.GetMethod and MethodInfo but I can't get them to work. Primarily because I don't know the type of the parent control and can't figure out how to get it. EDIT: My code for matt-dot-net. As you can see it's almost an exact duplicate of your code. For whatever reason it does not work for me as I have it here. When I click on the button the page reloads and is the same. When I un-comment the one line though and click the button then I see the error message.
View 1 Replies
Jul 27, 2010
My web site will have lots of pages, too many to provide links for in the menu as shown in the form of the wizard-generated menu. One solution I'm investigating is to have a main menu where each item will pop up a submenu, like in a Windows app.
Can I use a "Menu" control in a master page to do a pop up menu? If so can you point me to an example or show me (a novice) how to do it? I.e., each item will have a controller action, so how do I connect the menu item to the action method?
View 3 Replies
Jan 4, 2010
i want to display my navigation in 2 horizontal menus, one on the top, the other on the bottom. I also want to use sitemap since it ease the maintenance of links. Is there a simple way to achieve this ? (I am not talking about Parent child, say i want to display the first 8 nodes in up menu and the left in the bottom menu.)
View 5 Replies
Sep 1, 2010
I want to create a master page for my already developed project. Since the project contains many forms it is quite difficult to include the master page in each form. Is there any possibilities to include the master page in any other simplest way
View 2 Replies
Mar 18, 2010
Does anyone out there use ComponentOne's C1Menu and create a menu with subitems at runtime? I have went through their forums and help and anything at runtime is done with C1WebMenu which was replaced with this version.I need to create the whole menu with subitems. Can you show code for this if you have?
View 1 Replies
Oct 18, 2010
I have an ASP.Net 3.5 application with a menu. The menu is set to an xmlDataSource. The xmlDataSource is given the menus for the user as a dataset. The xmlDataSource uses an xsl transform file.Here is the code behind:
[Code]....
My problem is, when another user logs into the system, he/she gets the previous user's menus. This is based on time somehow, because if you wait long enough after another user has left a page, you'll get the proper menus.Could it have something to do with page caching? Is there something I'm missing with menus?
View 1 Replies
Jan 12, 2010
I want to create dynamic link buttons in the asp.net code based on who logged in. For e.g. if the salespesron logged in , he should see "Customer List" and "Item Search" as menu options.
If customer logged in , it should be able to see "Customer Details" and "Item Search" as menu options.
I'm not sure how to create this dynamically in html code.
I try to serach and found the code below on this forum but it doesn't appears to create any dynamic button menu.
[Code]....
View 7 Replies
Jun 14, 2012
How to correct my code... because if condition is going to false condition every time when i check the session value with admin user and agent user..
Code:
<td bgcolor="#808000" style="height: 22px">
<% If Session("S_UserName").ToString = "Admin" Then%>
<ul class="solidblockmenu"> <li> <a href="Dashboard.aspx" >Dashboard</a> </li><li> <a href="MasterUpload.aspx" >Master Upload</a> </li><li> <a href="InboxAgent.aspx" >Agent Inbox</a> </li><li> <a
[Code] ....
View 1 Replies
Sep 19, 2012
How to make menus on the header of master page in asp.net ...
View 1 Replies
Sep 27, 2010
I want to Display N-Heirarchical Menu using Dynamic Repeater Control along with CheckBoxes.
If Suppose i am having 3 level Menus i need to create 3 Repeaters Dynamically along with CheckBoxes beside of that sub Menus
View 3 Replies
Sep 2, 2010
Ok, everyone knows that the z-index is messed up in IE8 and that requires patches or workarounds...
What I can't seem to find a solution to is the white background on the DynamicMenu parts of a Menu control. Setting the background color to transparent or not setting it all doesn't seem to have any effect. This is only a problem in IE8, Firefox 3.6.8 renders the dynamic menus without the white background.
View 2 Replies
Sep 13, 2012
I want to create a menu similar to the following site
[URL]
View 1 Replies
Mar 29, 2011
I'm new to C# web development. I'm trying to reference a param from Site.Master.cs in Site.Master, so that in Site.Master page, I can do:
<%
if (someParam == true) {
%>
some HTML code
<%
}
%>
The param someParam is the one I want to pass from Site.Master.cs.
View 3 Replies
Apr 15, 2010
I am using a master page with a treeview control. I have 2 other pages Summary.aspx and Home.aspx
I want the Summary page to be loaded when I run the application but afterwards I want to load the Home.aspx page based on the selected Node change event of the treeview control.
I have placed the treeview control in master page because it has to remian the same for all my pages.
Did I do something wrong? The problem is I am not able to load the pages based on events occuring for Tree view control.
View 1 Replies
Mar 11, 2010
I have an ASP.NET website and I want to find the /bin/[Configuration] folder to use an external tool (an exe file). When I use reflection to get calling assemblies location it returns something similar to:
C:WindowsMicrosoft.NETFramework\...Temporary ASP.NET Filesa1388a5e\...my.dll
Since each dll has its own directory under the temp ASP.NET Files this fails for me. How can I get the location of the compiled binary folder where the dll's and the .exe is (i.e. bin/) instead of asp.net's temporary cache?
View 3 Replies
Jun 16, 2010
some samples for designing the menus and sub menus in html with styles and hover etc
View 8 Replies
Dec 5, 2010
How can I find all tags which have any attribute starting with some character?Something like ('TR[^a]) Here I am trying to find all TR which have any attribute starting with 'a'
View 2 Replies
Sep 28, 2010
I know parameters to attribute declarations have to be a constant expression and resolved at compile time. However, can I play with the concept of 'compile time'? ASP.net has the concept of App_Code folder. It looks from it's description like you can drop .cs files into it, even while the app is running, and it will be brought in and compiled. Is it possible to use this mechanism to dynamically create an Enum or const array that can be used in an attribute declaration?
[SomeAttribute(ValidTypes.SomeType)]
public class Foo
{
}
Basically, I want to dynamically grow the valid types in ValidTypes without having to recompile all components that reference it. And I need to keep it in sync with a list of values in a database table. So, my question is, can I drop a .cs file with the definition for an Enum or const string array into App_Code and have it automagically show up? Or better yet, is the mechanism .Net uses to do this available to be called elsewhere so I don't have to do it in an ASP.Net app?
View 1 Replies