2011-08-16 15 views
0

こんにちは、コントローラのエンティティをマッピングしてバインドすることを考えました。 モデル内のエンティティを正しくバインドしてモデルステートを使用できるようにするにはmvcが他のエンティティを参照してエンティティにバインドされているかどうかを確認する

私はMenuItemModelを使用して新しいMenuItemを作成しています。次のように私のMenuItemクラスが定義されている

public class MenuItemModel 
{ 
    public List<SelectListItem> Menus { get; set; } 
    public MenuItem MenuItem { get; set; } 
} 

public class MenuItem:Entity 
{ 

    public virtual int MenuItemId { get; set; } 
    public virtual Menu Menu { get; set; } 
    [Required] 
    public virtual string Name { get; set; } 
    public virtual int ItemOrder { get; set; } 
    public virtual string ExternalUrl { get; set; } 
    public virtual DateTime Created { get; set; } 
    public virtual bool Deleted { get; set; } 
    public virtual DateTime? DisplayUntil { get; set; } 
    public virtual User Author { get; set; } 

} iがコントローラに私のエンティティを結合今

// 
    // POST: /Administrator/MenuItem/Create 

    [HttpPost] 
    public ActionResult Create(MenuItem menuItem) 
    { 
     if (ModelState.IsValid) 
     { 
      // do saving logic 
     menuItem.Created = DateTime.Now; 
     menuItem.Author = this._userProvider.GetCurrentUser(); 
     menuItem.Menu = _menuRepository.Load(menuItem.Menu.MenuId); 

     } 
     //restore 
     MenuItemModel menuItemModel = new MenuItemModel(); 
     menuItemModel.MenuItem = menuItem; 
     menuItemModel.Menus = 
      this._menuRepository.All.Select(x => new SelectListItem() { Text = x.Name, Value = x.MenuId.ToString() }).ToList(); 

     return View(menuItemModel); 
    } 

唯一の問題は、私がMenuItemだけでなくMenu、Userについても検証を取得していることです。

どのようにしてこの検証を設定し、MenuItemエンティティの検証のみを受け入れるか?私はにModelState項目に行くと、私は必要なだけのエンティティを見つけ、彼らが有効であるが、私はこれを行う良い方法があるだろうと信じているかどうかを確認することができます知っている

PS ...

任意のアイデアが高く評価され。唯一のMenuItemエンティティの検証を受け入れるように、この検証を設定しなければならどう

答えて

2

コントローラアクションで検証する必要があるプロパティ(通常はフォームに含まれ、ユーザーが入力したプロパティ)のみを含むビューモデルを使用する必要があります。ビューモデルは、特定のビューの要件に合わせて設計されたクラスです。コントローラアクションは、ドメインモデルをビューに/ビューから渡すことはできません。コントローラアクションは、常にビューモデルをビューに/ビューから渡す/取るべきです。

public class MenuItemViewModel 
{ 
    public int MenuItemId { get; set; } 

    [Required] 
    public string Name { get; set; } 

    ... put any properties that are contained on the form with their 
     respective validation 
} 

は、あなたのPOSTのコントローラのアクションは、引数として、このビューモデルを取るています:たとえば

[HttpPost] 
public ActionResult Create(MenuItemViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     // there were some validation errors => redisplay the view 
     // so that the user can fix them 
     return View(viewModel); 
    } 

    // at this stage validation went fine 
    // TODO: map the view model back to a domain model 
    // (MenutItem or whatever you are willing to update) 
    // I would recommend you AutoMapper for this task: http://automapper.codeplex.com/ 

    // TODO: once you get the domain model pass it to a service layer 
    // method in order to perform the necessary business operation with it 
    // (in your case creating a menu item) 

    return RedirectToAction("Success"); 
} 
+0

のthnx automapperための先端のために、それについて少し読んで、それを使用したことがありませんでした。 thnx 4答えも.... – cpoDesign

関連する問題