2016-09-13 26 views
3

MVC 5 Webアプリケーションで次の問題があります。私は、テーブル[accountlist][UserId]から[Id][AspNetUsers]に外部キー関係を持つテーブルを作成するために、データベースの最初のアプローチとエンティティのフレームワークを使用しました。現在、該当するaccountlist.cshtmlにはドロップダウンメニューがあります。私も@Html.HiddenFor(model => model.UserId, new { @Value = HttpContext.Current.User.Identity.Name})を試しましたが、問題はどのように正しいユーザーIDとユーザー名が必要かということです(私は[UserName]から[AspNetUsers]を主キーにしたくありません)。ビューで使用するMVCでUserIdを取得

残念ながら、このsolutionに示唆されているように、HttpContext.Current.User.Identity.GetUserId()には、IDにはGetUserId()の定義が含まれていないと記載されています。

解決方法はありますか?

ありがとうございます!

+0

これはどうですか: 'Thread.CurrentPrincipal.Identity.GetUserId()'? –

+3

'GetUserId'は拡張メソッドです...対応する名前空間をインポートする必要があるかもしれません。 [この質問を参照してください](http://stackoverflow.com/questions/22624470/get-current-user-id-in-asp-net-identity-2-0) –

答えて

4

@ stephen.vakilが正しい。名前空間をインポートする必要があります。具体的には、あなたが追加する必要があります。

@using Microsoft.AspNet.Identity 
@model Namespace.To.Foo 

を別の方法として、あなたはより頻繁にこれを実行するか、単にビューで名前空間を含めたくない場合は、あなたのプロジェクトのViewsフォルダにWeb.configを編集することができます代わりにそれを追加してください:

<?xml version="1.0"?> 
<configuration> 
    ... 
    <system.web.webPages.razor> 
    ... 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Optimization" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="Microsoft.AspNet.Identity" /> 

すべての名前空間には、すべてのビューが自動的に使用できます。

-1

thisは、ベンフォスターのasp.net mvc認証に最適な記事です。それは私に最後の時間を助けた。

それはあなたがこの

var identity = new ClaimsIdentity(new[] { 
       new Claim(ClaimTypes.Sid, userID) 
      },  
      "ApplicationCookie"); 

     var ctx = Request.GetOwinContext(); 
     var authManager = ctx.Authentication; 

     authManager.SignIn(identity); 

同様

SIGINが私たちのカミソリビュー用のカスタムベースビューページを作成してみましょう

public class AppUser : ClaimsPrincipal 
{ 
    public AppUser(ClaimsPrincipal principal) 
     : base(principal) 
    { 
    } 

    public int ID 
    { 
     get 
     { 
      return this.FindFirst(ClaimTypes.Sid).Value; 
     } 
    } 
} 

新しいクラス

を作成するエンティティフレームワークのために行くされていない場合でも動作しますAppUserプリンシパルへのアクセスを提供する:

public abstract class AppViewPage<TModel> : WebViewPage<TModel> 
{ 
    protected AppUser CurrentUser 
    { 
     get 
     { 
      return new AppUser(this.User as ClaimsPrincipal); 
     } 
    } 
} 

public abstract class AppViewPage : AppViewPage<dynamic> 
{ 
} 

/views/web.configを開き、pageBaseType設定:お使いのコントローラのコンストラクタに次の行を追加します

<p> 
    User ID: @CurrentUser.ID? 
</p> 
+0

@Pang確かに、私はそれがいくらかスペースを取ると思った私のポイントを明確にする。 –

0

<system.web.webPages.razor> 
    <pages pageBaseType="NakedIdentity.Mvc.AppViewPage"> 

は、プロジェクトを再構築し、Index.cshtmlのビューを更新します:

​​

コントローラ内のすべての方法にuser.Idがあります。セキュリティ上の理由から、あなたのユーザーIDを隠しておくことは絶対に避けてください。

1

あなたは

その後、
int UserId = WebSecurity.CurrentUserId; 

をSimpleMemberShipプロバイダを使用して、コントローラのメソッドの先頭に[InitializeSimpleMembership]属性を追加している場合。

関連する問題