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

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

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

以“问题详细信息页面”(如“堆栈溢出”中的此页面)为例。

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

  • 投票提问/回答
  • 回答

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

  • 依此类推。

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

    我使用AutoMapper创建它。

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

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

    那被认为是一种干净的方法吗?还是有人可以建议一个更好的方法?

    请记住,我将在三页上重用此QuestionViewModel:
  • 问题详细信息页面
  • “问问题”页面
  • “编辑问题”页面

  • 因此,由于这些操作取决于页面/用户,因此使用AutoMapper确实无法完成。

    最佳答案

    我将设置一个单独的 Controller 和操作,它将返回包含必要链接的局部 View 。然后,我将使用Html.Action帮助程序从主 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);
        }
    }
    

    并在相应的partial中检查 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/

    10-17 03:00