我正在使用ASP.NET MVC进行项目。我使用了很多用户控件,我需要检查当前用户并检查它是否有角色等,现在我在每个UserControl中创建用户,我看到了权限。我想改变它,所以我只创建一次。
问题是什么是最好的aproch? viewData [“User”] =用户和获取用户表单在这里或什么?你有什么建议所以我可以摆脱这一行
LCP.eTorneos.Dal.EntityFramework.JugadorRepository jugadorRepository =
new LCP.eTorneos.Dal.EntityFramework.JugadorRepository();
var jugador = jugadorRepository.GetJugador(User.Identity.Name)
<% if (Page.User.Identity.IsAuthenticated && jugador.IsAdmin) { %>
...
<%}%>
答案 0 :(得分:3)
有两种选择。首先,使用ViewData [“User”] - 最简单但不是最好的(不是强类型)。第二个(如果您使用的是View Models),使用所有View模型的基本视图模型:
public class BaseViewModel {
public Jugador Jugador;
// Or simply add flag
public IsAdmin;
}
public class ConcreteViewModel : BaseViewModel {
public YourModel Model;
}
在控制器中:
var model = new ConcreteViewModel {
Model = yourModel,
IsAdmin = true /* false */
};
return View(model);
在视图中:
<%@ Page MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ConcreteViewModel>" %>
<!-- Or in SiteMaster: -->
<%@ Master Inherits="System.Web.Mvc.ViewMasterPage<BaseViewModel>" %>
<% if(Model.IsAdmin) { %>
...
<% } %>
<强>更新:强>
最好避免使用自定义过滤器复制代码并设置ViewModel的基础部分:
public class IsAdminAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// ...
(filterContext.Controller.ViewData.Model as BaseViewModel).IsAdmin = true; /* flase */
}
}
答案 1 :(得分:1)
首先谢谢@ eu-ge-ne。
这就是我所做的,我愿意接受新的建议,但这似乎有效: 我像这样创建一个ActionFilterAttribute:
public class JugadorAttribute : ActionFilterAttribute {
public override void OnActionExecuted(ActionExecutedContext filterContext) {
JugadorRepository jugadorRepository = new JugadorRepository();
Jugador jug = jugadorRepository.GetJugador(filterContext.HttpContext.User.Identity.Name);
filterContext.Controller.ViewData["JugadorActual"] = jug;
}
}
这将ViewData放在页面的当前播放器中。然后在我的控制器中我这样做:
[JugadorAttribute()]
public class HomeController : Controller {
现在的问题是ViewData不是强类型的,所以我在Html类中创建了这个帮助器:
public static class JugadorHelper {
public static Jugador GetJugador(this HtmlHelper html) {
return ((LCP.eTorneos.Dal.EntityFramework.Jugador)html.ViewData["JugadorActual"]);
}
}
和Whoala,现在我可以在我的观点中做到这一点:
Html.GetJugador().IsAdmin
答案 2 :(得分:1)
我相信这样的事情:
<%= Utils.GetJugador(ViewData).IsAdmin %>
比这更好:
<%= Html.GetJugador().IsAdmin %>
因为HtmlHelper扩展仅用于生成HTML标记
<强>更新强>
using System.Web.Mvc;
using LCP.eTorneos.Dal.EntityFramework;
public static class Utils {
public static Jugador GetJugador(ViewDataDictionary ViewData) {
return ViewData["JugadorActual"] as Jugador;
/* OR maybe ?
* return (Jugador)(ViewData["JugadorActual"] ?? new Jugador());
*/
}
}
希望这有帮助