2015-01-12 114 views
1

感谢您的回复多条路线, 我加入BeginExecuteCore在基本控制器这样 `公共类BaseController:控制器 { 保护覆盖的IAsyncResult BeginExecuteCore(AsyncCallback的回调,对象状态) { // string email = string.Empty; dbEntities dbcontext = new dbEntities();AttributeRouting:基于用户角色

 var userRoleName = (from n in dbcontext.VAgentClientEmails where n.Email == User.Identity.Name select n.Role).FirstOrDefault(); 

     if (userRoleName == "SuperAdmin") 
      RouteData.Values["role"] = userRoleName; 

     else 
      RouteData.Values["role"] = ""; 

     return base.BeginExecuteCore(callback, state); 
    }` 

,我在家里控制器都给予这样的

[Route("~/{role}/SavedSearch/Index")] public ActionResult Index() { ... }

其工作管理/ savedsearch /指数 并且如果我给fjsdfk/savedsearch /索引其在上述工作 案件它不应该工作..

并在其他情况下,我不想角色

我需要做任何改变吗?

+0

不希望显示控制器的名字吗? –

回答

0

要添加用户的角色进入网址这样定义路线:

[Route("~/{role}/propertysearch/Index")] 
public ActionResult Index() 
{ 
    // ... 
} 

,并添加这个方法到控制器。在这种情况下的url

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
{ 
    var userRoleName = //GetUserRoleName; 
    RouteData.Values["role"] = userRoleName; 
    return base.BeginExecuteCore(callback, state); 
} 

将是这样的::控制器开始执行时,用户角色将被添加到用户

管理员/ propertysearch /索引

用户/ propertysearch /索引

otherMemberRoleName/propertysearch/index

对于整个应用程序添加一个控制器并将其命名为BaseController然后将BeginExecuteCore方法将Basecontroller

public class BaseController : Controller 
{ 
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
    { 
     var userRoleName = //GetUserRoleName; 
     RouteData.Values["role"] = userRoleName; 
     return base.BeginExecuteCore(callback, state); 
    } 
} 

所有其他控制器继承形式BaseController

public class HomeController : BaseController 
{ 
    [Route("~/{role}/propertysearch/Index")] 
    public ActionResult Index() 
+0

谢谢你的回复 代替角色我只想要5个角色,如果我会给另一个字符串,它不应该工作,如果是这样的话,我必须做什么? – user3664368

+0

您必须将限制添加到仅接受所需角色的路线。 –

+0

我可以在global.asax中添加上面的方法,而不是添加每个控制器吗?这样它可以为整个应用程序通用,如果我将添加像那样如何访问每个控制器中使用路由约束 – user3664368