2017-04-24 26 views
1

我正在一个网站上工作,一旦用户登录,他就可以检查一些锻炼。在ASP.NET Core的布局中使用用户标识

不过,我试图通过从布局到其他页面的用户ID,如下

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
    <ul class="nav navbar-nav navbar-right"> 
     <li> 
      <a class="page-scroll">Profile</a> 
     </li> 
     <li> 
      @Html.ActionLink("Workouts", "Index", "Routines", new {id = Model.UserID }) 
     </li> 
     <li> 
      <a class="page-scroll">Evaluation</a> 
     </li> 
     <li> 
      <a class="page-scroll">Nutrition</a> 
     </li> 
     <li> 
      <a class="page-scroll">Services</a> 
     </li> 
     <li> 
      <a class="page-scroll">Membership</a> 
     </li> 
    </ul> 
</div> 

而且它不工作,我得到以下错误:

'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable' does not contain a definition for 'UserID'

但是,我的模型具有UserID属性。我可以看到它在SQL上正常工作,即使我从那里取出HTML.ActionLink,但是当我尝试从布局中传递该值时,它不起作用。

关于如何解决这个问题的任何建议?我一直在这里阅读,但目前为止还没有解决方案。
我可能会以错误的方式来解决问题。有没有办法将登录用户的ID正确传递给多个控制器以访问该用户的信息?

+0

为什么各地通过ID?我只想创建一个服务来抓取当前登录的用户,并使用依赖注入来获取这些信息。 – Becuzz

+0

您的代码是否有正确的程序集引用---使用Microsoft.EntityFrameworkCore; (并使用System.Linq; - 如果使用LINQ) – NBaua

+0

@Becuzz这实际上是一个很好的解决方案。它有缺点吗?我会尝试实现它并发回结果。 – LeinadDC

回答

3

因此,不要传递用户ID,如何使服务获取登录的用户,然后从数据库中获取所需的任何数据?这样你就可以在需要的地方注入服务。

public interface ILoggedInUserService 
{ 
    LoggedInUser GetLoggedInUser(); 
} 
public class LoggedInUserService : ILoggedInUserService 
{ 
    private readonly IHttpContextAccessor _httpContextAccessor; 

    public LoggedInUserService(IHttpContextAccessor httpContextAccessor) 
    { 
     _httpContextAccessor = httpContextAccessor; 
    } 

    public LoggedInUser GetLoggedInUser() 
    { 
     string username = GetLoggedInUsername(_httpContextAccessor.HttpContext.User); 
     if (!string.IsNullOrEmpty(username)) 
     { 
      return YourServiceToGetUserData.GetUserData(username); 
     } 
     return null; 
    } 

    private static string GetLoggedInUsername(ClaimsPrincipal principal) 
    { 
     return principal?.FindFirst(ClaimTypes.NameIdentifier)?.Value; 
    } 
} 

然后在Startup.cs,您可以设置您的服务,依赖注入补充一点:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
+0

工作就像一个魅力!非常感谢。 – LeinadDC