【问题标题】:What's a clean/DRY way to show available operations on user content?什么是干净/干燥的方式来显示用户内容的可用操作?
【发布时间】:2011-09-08 23:22:34
【问题描述】:

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

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

因此,我试图找出一种简洁的方法来处理用户可以在任何给定页面上执行的可用操作,具体取决于他们的角色和其他因素。

以“问题详情页面”为例(如 Stack Overflow 上的这个页面)。

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

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

问题所有者可以:

  • 编辑
  • 删除
  • 标记答案

等等。

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

我使用 AutoMapper 创建它。

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

我目前的想法是:

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

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

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

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

因此,由于这些操作依赖于页面/用户,因此 AutoMapper 无法真正完成。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor viewmodel user-roles


    【解决方案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 })
    

    【讨论】:

    • 你读懂了我的想法,这实际上是我最终做的!我创建了一个名为“ShowOptions”的操作方法,它采用帖子 ID(使其比问题更通用),然后渲染出部分视图。然后我使用 ajax $.get 将其渲染出来(不希望它立即渲染,而是在单击“显示选项”之后)。但是,是的——这基本上就是我最终要做的。很高兴我们在同一页上!
    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2015-02-13
    • 2011-10-18
    • 2010-12-08
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多