使用ASP.NET MVC 3(Razor)应用程序,该应用程序主要关注UGC(用户生成的内容)。
我正在开发一个“Q& A”区域 - 用户可以提问,其他人可以回答,投票等。
因此,我正试图找出一种干净的方式来处理用户可以根据其角色和其他因素在任何给定页面上执行的可用操作。
采用“问题详细信息页面”的方案(如Stack Overflow上的此页面)。
任何(经过身份验证的)用户都可以:
问题所有者可以:
等等。
现在,我有一个QuestionViewModel
,用于显示此特定视图的问题和相关答案。
我使用AutoMapper创建它。
如何根据可用的操作在页面上显示“stickies”(例如超链接)?
我目前的想法是:
QuestionOperation
(答案,编辑,禁用,投票,答案等)IEnumerable<QuestionOperation>
类型的属性添加到我的ViewModel Html.ActionLink
这被认为是一种干净的方法 - 还是有人可以提出更好的方法?
请记住,我在三页上重复使用此QuestionViewModel
:
因为这些操作依赖于页面/用户,所以使用AutoMapper无法实现。
答案 0 :(得分: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 })