Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在asp.NET MVC中获取当前用户,以便检查用户控件中的操作_.net_Asp.net Mvc_Authentication - Fatal编程技术网

在asp.NET MVC中获取当前用户,以便检查用户控件中的操作

在asp.NET MVC中获取当前用户,以便检查用户控件中的操作,.net,asp.net-mvc,authentication,.net,Asp.net Mvc,Authentication,我正在使用ASP.NETMVC进行一个项目。我使用了很多用户控件,我需要检查当前用户,检查它是否有角色等,现在我在我看到权限的每个用户控件中创建用户。我想改变它,所以我只创建一次 问题是什么是最好的方案?viewData[User]=用户和在此处获取用户表单还是什么?你有什么建议,这样我就可以摆脱这些台词了 LCP.eTorneos.Dal.EntityFramework.JugadorRepository jugadorRepository = new

我正在使用ASP.NETMVC进行一个项目。我使用了很多用户控件,我需要检查当前用户,检查它是否有角色等,现在我在我看到权限的每个用户控件中创建用户。我想改变它,所以我只创建一次

问题是什么是最好的方案?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) { %>
      ...
 <%}%>

有两种选择。首先,使用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());
         */
    }
}