2017-04-24 39 views
0

我想从User对象访问我的视图中的一些自定义属性。我正在实现身份验证的自定义属性,我正在更改我的global.asax中的HttpContext.Current.User如何访问视图中的HttpContext.Current.User自定义属性

这是User

public class User : IPrincipal 
{ 
    ... 
    public bool IsAdministrator => IsInRole(RolesConstants.GlobalAdministrator); 
    ... 
} 

这里是我设置在我Global.asax

protected void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e) 
    { 
     ... 

     var winUser = new User 
     { 
      EMail = user.Person.Email, 
      FirstName = user.Person.FirstName, 
      LastName = user.Person.LastName, 
      Identity = wi, 
      NetworkAccountName = user.UserName, 
      UserId = user.UserName, 
      Roles = userRoles, 
     }; 

     HttpContext.Current.User = winUser; 
    } 

例如,我怎么能这样做?

<button type="button" visible="@User.IsAdministrator" id="btn"></button> 

由于User对象已经接近我不想在Model传递或使用字符串中的观点,如@User.IsInRole("Admin")

编辑:我应该做一个自定义类型从IPrinciple派生并探讨这样的类型?

... 
     IIdentity Identity { get; } 
     bool IsInRole(string role); 
     bool IsAdministrator; 
... 
+0

您确定@User在视图中可用吗? –

+0

你可以创建一个自定义的'RazorViewBase'类并从它派生你的视图。自定义类可以为用户提供自己的视图实现。 –

+0

@Kevin,是的,它是 –

回答

2

您需要的User物业投放到您的自定义类:

@{ 
    var user = User as MyNamespace.User; // MyNamespace is the namespace of your User class 
} 

<button type="button" visible="@user.IsAdministrator" id="btn"></button> 

[编辑]

使用的扩展方法的另一种快速和肮脏的解决方案:

public static class ViewUserExtensions { 

    public static User ToCustom(this IPrincipal principal) 
    { 
     return principal as User; 
    } 
} 

<button type="button" visible="@User.ToCustom().IsAdministrator" id="btn"></button> 
+0

扩展方法只能在服务器端访问。有什么缺失来实现它?我宁愿让这个视图比视图变量 –

+0

当然,因为视图是在服务器端渲染的。请记住在视图中添加正确的using语句,以便可以使用扩展方法'@using MyNamespace',其中'MyNamespace'是包含'ViewUserExtensions'类的命名空间。 –

+0

Doh,非常感谢! –