0

MVC3、c# での作業

モデル、クラス、データベース テーブル、および部分クラスの「階層」について疑問に思っています。

データベースには、次のような構造の UserAccount テーブルがあります。

USERACCOUNT: UserId、名、姓、ログイン、パスワード、電子メール

私のプロジェクトには、UserModel というモデルがあります。プロパティをデータ注釈で装飾できるように使用しています。次のように、useraccount クラスのメタデータ型として設定されます。

[MetadataType(typeof(UserModel))]
public partial class useraccount
{
}

public class UserModel
{
    public int UserId { get; set; }

    [Display(Name="First Name")]
    [StringLength(20)]
    [Required]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [StringLength(30)]
    [Required]
    public string LastName { get; set; }

    [Display(Name = "Email Address")]
    [StringLength(20)]
    [Required]
    public string email { get; set; }

    [Remote("IsUserNameAvailable", "Validation")]
    [Display(Name = "Choose a Login Name")]
    [StringLength(40)]
    [Required]
    public string login { get; set; }

    [Display(Name = "Choose a Password")]
    [StringLength(64)]
    [Required]
    public string password { get; set; }

    [Display(Name = "Enter Password Again")]
    [StringLength(64)]
    [Required]
    public string confirmPassword { get; set; }

}

データベース テーブルには「Password」列がありますが、UserModel には「confirmPassword」はありません。

私の考えでは、メタデータに UserModel クラスを使用する UserAccount クラスには、「confirmPassword」の定義が含まれているはずです。

これが私が抱えている問題です。Register ビューでは、UserModel をモデルとして使用しているため、ページの上部に次のように表示されます。

@model OurAgreements.Models.UserModel

保存しようとすると、コントローラーに問題が発生します。このコード:

    public ActionResult Register(UserModel model)
    {
        var repo = new Repository();

        if (ModelState.IsValid)
        {
            using (var db = new ouragreementEntities())
            {
                db.useraccount.Add(model);
                db.SaveChanges();
            }

            return View();
        }

エラーが発生し、UserModel をユーザーアカウントに変換できません。私はこれを理解できます。すべての列と一致しないテーブルにデータを入れようとしています。

そこで、ビューのモデルを次のように変更すると考えました。

 @model OurAgreements.Models.useraccount

私の考えでは、useraccountクラスはUserModelを使用する必要がありますが、それを行うと、「useraccountには「confirmPassword」の定義がありません」というエラーが発生します

だから私は少し立ち往生しています。UserModel をモデルとして使用するように切り替えることができることはわかっています。その後、コントローラーで新しいユーザー アカウント インスタンスを作成し、モデルからのデータを入力して、インスタンスをデータベースに保存できます。

それで、私の質問だと思いますが、useraccount に confirmPassword の定義が含まれていないのはなぜですか?

4

2 に答える 2

1

まず最初に。クラスの名前を変更します。UserAccountMetadata / UserAccount を使用します。これにより、物事が読みやすく理解しやすくなります。

また、パスワードの確認フィールドで比較属性を使用して、それらが一致していることを確認できるようにします。datatype 属性は、両方のパスワード フィールドに存在する必要があります。

[DataType(DataType.Password)]
[Display(Name = "Confirm Password")]
[Compare("Password", ErrorMessage = "Password and confirm password must be same!")]
public string confirmPassword { get; set; }

ビューが使用するモデルは UserAccount である必要があります。

ビュー モデル (UserAccount) をデータベースに保存するメソッドに渡す前に、メソッドが受け取るオブジェクト (ドメイン モデル オブジェクトのように見える) にマップする必要があります。手動で行うこともできますが、面倒です。AutoMapper などのマッピング ツールを使用して、それを自動的に行います。UserAccount のどのフィールドがドメイン モデルのどのフィールドにマップされるかを AutoMapper に伝えることができます。

于 2013-04-11T22:05:16.647 に答える