在asp.NET MVC中获取当前用户,以便检查用户控件中的操作
我正在使用ASP.NETMVC进行一个项目。我使用了很多用户控件,我需要检查当前用户,检查它是否有角色等,现在我在我看到权限的每个用户控件中创建用户。我想改变它,所以我只创建一次 问题是什么是最好的方案?viewData[User]=用户和在此处获取用户表单还是什么?你有什么建议,这样我就可以摆脱这些台词了在asp.NET MVC中获取当前用户,以便检查用户控件中的操作,.net,asp.net-mvc,authentication,.net,Asp.net Mvc,Authentication,我正在使用ASP.NETMVC进行一个项目。我使用了很多用户控件,我需要检查当前用户,检查它是否有角色等,现在我在我看到权限的每个用户控件中创建用户。我想改变它,所以我只创建一次 问题是什么是最好的方案?viewData[User]=用户和在此处获取用户表单还是什么?你有什么建议,这样我就可以摆脱这些台词了 LCP.eTorneos.Dal.EntityFramework.JugadorRepository jugadorRepository = new
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) { %>
...
<%}%>
有两种选择。首先,使用ViewData[User]——最简单但不是最好的非强类型。其次,如果要使用视图模型,请对所有视图模型使用基本视图模型:
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) { %>
...
<% } %>
首先感谢@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;
}
}
<%= Utils.GetJugador(ViewData).IsAdmin %>
这会将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"]);
}
}
哇,现在我可以在我的观点中做到这一点:
Html.GetJugador().IsAdmin
我相信这样的事情:
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;
}
}
<%= Utils.GetJugador(ViewData).IsAdmin %>
希望这有助于这是可行的,但您必须让舒尔成为每个控制器中的角色。一旦未完成,将从请求中获取值。很高兴将它放在一个过滤器中。@我知道这是正确的方向,但我有一个问题,这个过滤器放在控制器中,我如何在视图中获取这些信息,以便决定是否显示链接?例如,在操作创建模型并填充数据后,过滤器立即处理模型。然后,过滤器的OnActionExecuted方法激发并设置IsAdmin属性。然后您的ViewModel转到视图您的视图必须使用ViewModelBase或从ViewModelBase派生的类进行强类型化,您可以在其中使用Model.IsAdmin属性检查我的解决方案,让我知道您的想法我有一个建议。我认为HtmlHelper不是GetJugador扩展的合适地方HtmlHelper扩展只处理创建HTML标记。而是使用以下方法创建静态实用程序类:Jugador GetJugadorViewDataDictionary ViewData{将ViewData[JugadorActual]返回为Jugador;}。
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());
*/
}
}