1

ASP.NET MVC 3 で初めて遊んで、非常に単純であるべきことを行うのに本当に苦労しています。

組み込みのメンバーシップ機能を使用してユーザーを登録していますが、デフォルトで提供されるプロパティではない姓名も保存したいと考えています。

これらのプロパティを MembershipUser クラスに追加する方法がわかりません (それが適切なクラスであっても、ここで何が起こっているのかを理解するのは困難です)。また、新しい「UserDetails」モデルを作成しようとしましたが、UserID を外部キーとして使用して、それを通常のユーザー テーブルにリンクする方法がわかりませんでした。

Code First アプローチを使用して ASP.NET MVC 3 Web アプリケーションに追加のユーザー情報を格納する正しいアプローチは何ですか? これは非常に単純でなければならないので、ここで何か間違ったことをしているに違いありません。カスタム プロファイル プロバイダーについて、このような基本的な機能に対して過剰に思えるものを目にしています。

誰でも私を正しい方向に向けることができますか? ありがとう。

4

3 に答える 3

0

これは MVC 固有の回答ではありませんが、ASP.Net メンバーシップ プロバイダーは、単純な承認シナリオ向けに設計されており、追加情報を添付しません。これに関するMSDNのドキュメントによると、「メンバーシップをユーザープロファイルプロパティと統合して、個々のユーザーに合わせて調整できるアプリケーション固有のカスタマイズを提供することもできます。」

first と last name のプロパティを含むプロファイル スキーマを作成する必要があります。おそらく次のようになります。

<profile defaultProvider="AspNetSqlProfileProvider">
  <properties>
     <add name="FirstName" type="System.String" />
     <add name="LastName" type="System.String" />
  </properties>
</profile>

そして、HTTP コンテキストの User プロパティからプロファイルの詳細を参照できます。

チュートリアル: プロファイル プロパティを使用した Web サイトのユーザー情報の管理も参照してください。

幸運を!

于 2013-03-10T07:40:17.353 に答える
0

正直なところ、Membershipデータベース スキーマはほぼすべてが BLOB フィールドで構成されており、既定のプロバイダーは組み込みの ADO ロジックを使用することを前提としているため、既定のツールは使用しません。Code Firstについて言及したので、Entity Frameworkを使用している(または使用したい)と思います。MembershipEF (またはその他のデータ アクセス ツール) を活用できるカスタム プロバイダーを作成することは、それほど難しいことではありません。

指示が必要な場合は、https://github.com/tiesont/Monkey.CMS/tree/master/Monkey.Web/Core/Providers で、私の個人サイトの と プロバイダーの両方に使用する実装を見つけることができMembershipますRole。はい、カスタム プロバイダーはやり過ぎです。私の実装を見ると、動作するプロバイダーを取得するために抽象基本クラス メソッドのほとんどを実装する必要がないことがわかります。

于 2013-03-10T05:30:10.600 に答える
0

RegisterModel以下のように、これらのプロパティを追加する必要があります。

 public class RegisterModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email address")]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [System.Web.Mvc.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
       //Put annotatons as needed
        public string FirstName {get;set;}
        public string LastName {get;set;}
    }

Registerこの後、 のメソッドを使用して、これらの詳細をデータベースに入れる必要がありますAccountController。これは、UserIdfromMembershipを取得し、追加の詳細をデータベース内の this に対して完全に別のテーブルに配置することで管理できます。このUserIdテーブルは次のようになります。

public class ExtendedUser
{
    [Key]
    public Guid UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

したがって、上記のテーブルにデータを保存するために、次の変更Registerで注釈が付けられたメソッドです。[HttpPost]

[HttpPost]

public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        // Attempt to register the user
        MembershipCreateStatus createStatus;
        Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

        if (createStatus == MembershipCreateStatus.Success)
        {
            FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
           //Get UserId for registered user
            var UserId = (Guid)Membership.GetUser(model.UserName).ProviderUserKey;
            ExtendedUser extrainfo = new ExtendedUser();
            extrainfo.UserId = UserId;
            extrainfo.FirstName= model.FirstName;
            extrainfo.LastName= model.LastName;
            //Add this info to database
            db.ExtendedUsers.Add(extrainfo);
            db.SaveChanges();
            return RedirectToAction("Index", "Home");
        }
        else
        {
            ModelState.AddModelError("", ErrorCodeToString(createStatus));
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

DbContextもちろん、クラスから継承したこの新しいテーブルを以下のように追加する必要があります。

 public class YourContext: DbContext
    {
        public DbSet<ExtendedUser> ExtendedUsers{ get; set; }
    }

黙って...そしてあなたは終わりです。

編集 :

Microsoft は、How to: Implement a Custom Membership Userでこれを別の方法で行っていますが、そこには何かが欠けています.しかし、あなたはそれを見ることができます.

于 2013-03-10T05:04:05.530 に答える