2010-03-13 61 views
2

在.NET MVC应用程序中封装对功能的访问有哪些不同的解决方案?在.NET MVC中包装访问功能的方法?

例如,我有六个选项卡,分别代表应用程序的不同区域,在区域1中,可以添加,编辑,上传任何内容。

我需要一个中心的方式说:

  1. 构建什么样的用户可以做一些解释
  2. 包裹标签,按钮,链接等,验证用户可以访问此片的功能,并且表演/适当地隐藏。

我知道我可以通过操作过滤器和角色限制对操作的访问,但是从UI中怎么样?

任何帮助,将不胜感激。我相信我不是唯一需要这样做的人,谢谢!

回答

2

首先,您还需要执行服务器端授权。任何人都可以冒充你的客户并直接调用你的控制器,绕过你的客户端授权。

但在这里就是我想要做的:

创建AuthorizationService集中存储这种业务逻辑。这将有类似的方法:

public bool CanEditSomeObject(Guid userId, Guid objectId) 

使用此AuthorizationService您的控制器(或控制器引用的另一个服务)的内部构造的视图模型与查看所需的所有授权信息。

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit(Guid id) 
    { 
     bool currentUser = _userService.GetUser(User.Identity.Name); 
     bool canEditSomeObject = _authenticationService.CanEditSomeObject(currentUser.Id, id); 
     var viewModel = new SomeObjectViewModel {CanEditSomeObject = canEditSomeObject}; 
     return View(viewModel); 
    } 

使您的视图强制类型化并根据模型修改HTML。你可以使用像局部视图这样的东西来使这个更清洁。但是,您只需隐藏,禁用或不包含当前用户无法访问的内容的HTML。

<%= if (Model.UserCanEdit) Html.RenderPartial("EditForm.ascx") %> 

另外,如果你需要动态改变客户端的东西(例如,用户执行动作,所以现在他们可以执行动作b)你可以使用jQuery来操纵HTML。你甚至可以使用JQuery调用你的控制器来询问它是否有问题(见question),但我不确定这是否必要。

+0

你有一些示例代码? – 2010-03-13 07:53:52

+0

不错!感谢您的建议,我会尝试一下。 – Kevin 2010-03-14 18:07:55