2017-04-24 11 views
1

私はWebサイトで作業しています。ユーザーがログインすると、いくつかのトレーニングをチェックすることができます。ASP.NETコアのレイアウトでユーザー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> 

を以下そして、それが動作していないとして、他のページにレイアウトからユーザーIDを渡すためにしようとしている、私は次のエラーを取得する:

'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

userIDを渡すのではなく、ログインしたユーザーを取得してデータベースから必要なデータを取得するサービスを作成する方法はありますか?そうすれば、必要な場所にサービスを注入できます。

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

関連する問題