7

私はASP.NET MVC 3アプリケーションを開発しています。私は、アプリケーションのクラスを作成するためにまずエンティティフレームワークコードを使用しています。 DBContextおよびDBEntities定義をクリーンに保ち、その上で操作を実行するためのリポジトリ。ASP.NET MVC - 新しいモデルを作成するか、Entityフレームワーククラスを使用します

疑問は、ビューのレンダリングと、編集モデルが保存される方法です。

私はDBに保存されているユーザーを表すこの実体がある場合:

//Entity: 
public class User 
{ 
    [Key] 
    public int IdUser { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
} 

を、私はさせるためには、姓、姓、電子メールやNEWPASSWORD、ConfirmPaswordとCurrentPasswordとビューを表示したいですユーザーは自分のデータを変更し、CurrentPasswordを入力して変更を確認します。私の疑問は、ConfirmPaswordやCurrentPasswordのようなものが私のエンティティにはありませんので、私はこのViewの新しいモデルを作成し、私の新しいモデルを私のデータベースエンティティに保存するには?同様に:

public class UpdateUserModel 
{ 

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

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

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

    [DataType(DataType.Password)] 
    [Display(Name = "New password")] 
    public string NewPasword{ get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm the New Pasword")] 
    [Compare("NewPasword", ErrorMessage = "Password doesn´t mach.")] 
    public string ConfirmPasword{ get; set; } 

    [Required(ErrorMessage = "Need to specify the current password to save changes")] 
    [DataType(DataType.Password)] 
    [Display(Name = "Current Password")] 
    public string CurrentPassword { get; set; } 
} 

と私が作ったコントローラで:

public ActionResult UpdateUser(User u) 
{    
    repository.UpdateUser(u);    
    return View(); 
} 

私が持っているので、場合に、どのようにi:

public ActionResult UpdateUser(UpdateUserModel model) 
{    
    User u = (User)Membership.GetUser();    
    u.FirstName = model.FirstName; 
    u.LastName = model.LastName; 
    u.Email = model.Email; 

    if (!String.IsNullOrEmpty(model.NewPassword)) 
    { 
     u.Password = FormsAuthentication.HashPasswordForStoringInConfigFile(model.NewPassword.Trim(), "md5"); 
    } 

    repository.UpdateUser(u); 

    return View(); 
} 

のようなコントローラを持つこれを行うのいずれかの方法があります。この特定のビューの検証を行うために、ConfirmPasswordまたはCurrentPasswordのようなフィールドを追加できます。

答えて

6

私があなたの場合は、私のプレゼンテーション層でドメインモデルを使用しません。私は非常に私のドメインモデルに似ているビューモデル(別のクラス)を作成します。次に、自動マッピングツールを使用して、ドメインモデルからビューモデルにマップします。

これは非常に一般的なシナリオなので、Googleで「ビューとドメイン」モデルを使用する場合は、必要なものすべてを見つける必要があります。

public class User { 
     [Key] 
     public int IdUser { get; set; } 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 

} 

public class UpdateUserViewModel { 
    // Original fields 

    public string Password { get; set; } 

    public string PasswordConfirmation { get; set; 
} 

次に、あなたのボイラープレートコードを削除するには、自動マッパーを設定できます。

public ActionResult ShowUser() 
{ 
    var domainModel = new User(); // I'm assuming that properties are set somewhere 
    var viewModel = new UserViewModel(); 

    Autommaper.Map(domainModel, viewModel); 

    return View(viewModel); 
} 

これは非常に粗いですが、うまくいけばあなたのアイデアを得ます。

アップデート1:**

私が理解できるように、各ビューのための新しいモデルを作成し、それはちょうど良くありませんエンティティ

にそれをマッピングするために優れています、それは懸念のより良い分離を提供し、あなたのコードを容易にテスト可能にします。クラスの名前を見るだけで、その目的はUpdateUserViewModel、RegisterUserViewModelなどがわかります。

このクラスの元のフィールドは、検証済みのメタデータであると考えられています。私が意味する、元のフィールドによって

public class UserViewModel{ 
    public string UserName { get; set; } 
    public string FirstName { get; set; } 

} 

これらのフィールドは、あなたのUserクラスに既にあるので、私は再びそれらを入力しないで私の時間を救いました。

これは私のモデルをMVCからMVVMに変更するか、beacuseに変更しますか?まだコントローラがありますか?

私はMVVMではなくMVCパターンであると考えています。

オートペーパーについて、github.com/AutoMapper/AutoMapperを使用していますか?

Automapperは私が使用しているものです。そこにいくつかのツールがあり、彼らはほとんど同じことを行う。いくつか試してみて、最も要件に合ったものを見つけてください。

幸運。

+1

さて、私はそれを得る。私が理解したように、各ビューの新しいモデルを作成し、それをエンティティにマップする方が良いと思います。このクラスの元のフィールドは、検証付きのメタデータであるはずです。これは私のモデルをMVCからMVVMに変更するか、beacuseではないですか?私はまだコントローラを持っていますか? Automaperについては、https://github.com/AutoMapper/AutoMapperを使用していますか? – juan25d

+0

更新1を参照してください –

+0

検証とメタデータはどこに書き込むべきですか? UserViewModelクラスではありませんか? – juan25d

1

通常、私はこの余分なコードを置く場所の脇に、プロジェクトのさまざまな部分の領域を使用します。

あなたのモデルフォルダには、viewmodel.csクラスを追加することになります。このクラスの内部には、データがビュー内でどのようにモデル化されるかに関する定義が保持されます。これらのビューモデルは、ユーザが対話することを望むエンティティの部分を反映します。対話は、コントローラで対話するビューモデルを渡す[HttpGet]と、モデルを送り返してエンティティにマップする[HttpPost]を介して行われます。

ViewModels.cs:

public class UserViewModel 
{ 
public string UserName { get; set; } 
} 

SomeController:

public ActionResult getView() 
{ 
var uvm = new UserViewModel(); 
return View(uvm); 
} 

ビューgetView.cshtml:

@model project.namespace.UserViewModel 

@using (Html.BeginForm()) 
{ 
@Html.EditorFor(m => m.UserName) 
<input type="submit" value="New User Name" /> 
} 

バックコントローラで:

[HttpPost] 
public ActionResult getView(UserViewModel model) 
{ 
var entity = new ActualEntity(); 
entity.username = model.UserName; 
//more mapping 
//commit changes somewhere 
return RedirectToAction("getView"); 
} 
+0

これは多かれ少なかれ私が今持っていることです、問題は私がすべての時間を私のエンティティをmodelviewとviceversaに写像する問題をスキップしたいのですが、あなたの答えで私はそうだと思いますエンティティからビューへの異なるバリデーション/プロパティを持つ唯一の方法です。ありがとう! – juan25d

関連する問題