什么是干净/干燥的方式来显示用户内容的可用操作?

RPM*_*984 5 asp.net-mvc viewmodel user-roles razor asp.net-mvc-3

使用ASP.NET MVC 3(Razor)应用程序,主要关注UGC(用户生成的内容).

我正在开发一个"Q&A"区域 - 用户可以提问,其他人可以回答,投票等.

因此,我正在尝试找出一种干净的方法来处理用户可以根据其角色和其他因素在任何给定页面上执行的可用操作.

采用"问题详细信息页面"的方案(如Stack Overflow上的此页面).

任何(已验证的)用户都可以:

  • 投票回答问题/答案
  • 回答

问题拥有者可以:

  • 编辑
  • 删除
  • 马克回答

等等.

现在,我有一个QuestionViewModel,用于显示此特定视图的问题和相关答案.

我使用AutoMapper创建它.

如何根据可用的操作在页面上显示"胶粘物"(例如超链接)?

我目前的想法是:

  • 我创建一个枚举:( QuestionOperation答案,编辑,禁用,投票,答案等)
  • 我将一个类型的属性添加IEnumerable<QuestionOperation>到我的ViewModel
  • 我在我的操作方法(HTTP GET)中设置了这个属性,检查用户是否经过身份验证以及他们所属的角色.
  • 然后我使用编辑器模板将每个操作渲染为超链接,使用 Html.ActionLink

这被认为是一种干净的方法 - 或者任何人都可以提出更好的方法?

请记住,我QuestionViewModel在三页上重复使用它:

  1. 问题详细信息页面
  2. "提问"页面
  3. "编辑问题"页面

因为这些操作依赖于页面/用户,所以使用AutoMapper无法实现.

Dar*_*rov 1

我将设置一个单独的控制器和操作,它将返回包含必要链接的部分视图。然后我将使用Html.Action帮助器将其包含在主视图中。

行中的一些内容:

public class UserLinksController: Controller
{
    // TODO: ctor DI of a repository, etc...

    public ActionResult Index(string questionId)
    {
        string username = User.Identity.IsAuthenticated 
            ? User.Identity.Name : string.Empty;
        var roles = _repository.GetRolesForQuestion(username, questionId);
        var model = Mapper.Map<UserRoles, RolesViewModel>(roles);
        return PartialView(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

在相应的部分中,您将检查视图模型并呈现必要的链接:

@model RolesViewModel
@if(Model.CanEdit)
{
    @Html.ActionLink("Edit", "Edit", "Questions")    
}
@if(Model.CanDelete)
{
    @Html.ActionLink("Delete", "Delete", "Questions")    
}
...
Run Code Online (Sandbox Code Playgroud)

现在,您的主视图中的某个位置只需使用以下方法包含此操作Html.Action

@Html.Action("Index", "UserLinks", new { questionId = Model.QuestionId })
Run Code Online (Sandbox Code Playgroud)