asp.net-mvc - 在用户内容上显示可用操作的干净/干燥方式是什么?

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

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

我正在“问答”区域工作 - 用户可以在其中提问,其他人可以回答、投票等。

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

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

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

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

  • 问题所有者可以:
  • 编辑
  • 删除
  • 标记答案

  • 等等。

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

    我使用 AutoMapper 创建它。

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

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

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

    请记住,我正在重新使用此 QuestionViewModel在三页上:
  • 问题详情页
  • “提问”页面
  • “编辑问题”页面

  • 所以因为这些操作是依赖于页面/用户的,所以它不能用 AutoMapper 来完成。

    最佳答案

    我会设置一个单独的 Controller 和 Action ,它将返回一个包含必要链接的部分 View 。然后我会使用 Html.Action helper 从主 View 中包含它。

    其中的一些内容:

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

    在相应的部分中,您将检查 View 模型并呈现必要的链接:
    @model RolesViewModel
    @if(Model.CanEdit)
    {
        @Html.ActionLink("Edit", "Edit", "Questions")    
    }
    @if(Model.CanDelete)
    {
        @Html.ActionLink("Delete", "Delete", "Questions")    
    }
    ...
    

    现在在您的主 View 中的某处使用 Html.Action 简单地包含此操作方法:
    @Html.Action("Index", "UserLinks", new { questionId = Model.QuestionId })
    

    关于asp.net-mvc - 在用户内容上显示可用操作的干净/干燥方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6247009/

    相关文章:

    c# - MVC3模型数据分离

    .net - MVC3 默认模板在哪里存储用户帐户信息?

    razor - 如何使用 Razor 在 Umbraco 中获取绝对媒体文件路径?

    asp.net-mvc - Visual Studio 无法解析模型,但可以加载 Razor 页面

    c# - 布局文件中的渲染部分

    css - 如何在 MVC 上使用 Ajax Helper 创建切换按钮

    c# - Office 365 与 Asp.net Web 应用程序(MVC 应用程序)的集成?

    c# - 在没有回发的客户端过滤 Grid.Mvc

    sql-server - EFCodeFirst 和 SqlCe4 的唯一约束

    c# - asp.net mvc web api 的最终用户风格测试