5

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

我正在开发一个“问答”区域——用户可以在这里提问,其他人可以回答、投票等。

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

以“问题详细信息页面”为例(如 Stack Overflow 上的此页面)。

任何(经过身份验证的)用户都可以:

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

问题所有者可以:

  • 编辑
  • 删除
  • 标记答案

等等。

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

我使用 AutoMapper 创建它。

如何根据可用的操作在页面上显示“便签”(例如超链接)?

我目前的想法是:

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

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

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

  1. 问题详情页面
  2. “提问”页面
  3. “编辑问题”页面

所以因为这些操作是依赖于页面/用户的,所以 AutoMapper 并不能真正做到。

4

1 回答 1

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);
    }
}

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

@model RolesViewModel
@if(Model.CanEdit)
{
    @Html.ActionLink("Edit", "Edit", "Questions")    
}
@if(Model.CanDelete)
{
    @Html.ActionLink("Delete", "Delete", "Questions")    
}
...

现在在您的主视图中的某处使用以下Html.Action方法简单地包含此操作:

@Html.Action("Index", "UserLinks", new { questionId = Model.QuestionId })
于 2011-06-06T06:34:12.797 回答