0

ベースモデルとそこから派生したビューモデルがあります。

ベースモデル

public class Feed
{
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}

派生モデル

public class FeedViewModel :  Feed
{
   public bool EditMode { get; set; }    
}

データ アクセス層

public Feed GetFeed(){
   --db code to retreive all feed
}

コントローラ

public FeedController : Controller
{
   public ActionResult Index()
   {
        var data = DAL.GetFeed();
        var model = new FeedViewModel{ EditMode = true };

         model.Id = data.Id;
         model.Name = data.Name;
         model.Url = data.Url;   //This is working

       //But i dont want like this, coz i cant reassign all the proerties again. Is there any other easy way like this
        model = (FeedViewModel)data;
    } 
 }

すべてのプロパティ値を派生モデルに再度割り当てたくありません。代わりに、他の簡単な方法を探していますか? 何か案は?

4

2 に答える 2

2

継承の代わりに構成を使用することをお勧めします。

public class FeedViewModel
{
    public bool EditMode { get; set; }    
    public Feed Feed { get; set; }
}

それで:

var data = DAL.GetFeed();
var model = new FeedViewModel { EditMode = true, Feed = data };

基本的に、ビューモデルがビューモデルのモデルと同じであるとは思いません。そのモデルを使用できるようにしたいのですが、継承を使用することは期待していません。

ビューモデルは、必要に応じて委任を介してビューのプロパティを公開できます-おそらくプロパティ変更通知を使用します。

EDIT:別の代替手段(どちらも適用できない場合があります-このプロジェクトでどれだけ変更できるGetFeedかわかりません)は、DALでメソッドをジェネリックにすることです:

public Feed GetFeed<T>() where T : Feed, new()
{
   --db code to retreive all feed
}

次に、次のように呼び出すことができます。

var model = DAL.GetFeed<FeedViewModel>();
model.EditMode = true;
于 2013-05-03T13:20:00.673 に答える
0

AutoMapperを使用します。

AutoMapperConfig次のようなクラスを作成します。

public class AutoMapperConfig
{
    public static void CreateMaps()
    {
        // Feed domain / view model mappings
        Mapper.CreateMap<FeedViewModel, Feed>()
        Mapper.CreateMap<Feed, FeedViewModel>();            
    }
}

CreateMaps()からメソッドを呼び出してGlobal.asax、アプリケーションの開始時にマッピングを登録します。

今、あなたActionがする必要があるのはこれだけです:

public FeedController : Controller
{
   public ActionResult Index()
   {
        var data = DAL.GetFeed();
        var model = Mapper.Map<Feed, FeedViewModel>(data);
        model.EditMode = true;

        return View(model)
    } 
 }

そして、他のアクションでは、プロセスを逆にするだけです

[HttpPost]
public ActionResult SomeOtherAction()
{
    FeedViewModel model = new FeedViewModel();
    TryUpdateModel(model);

    if (ModelState.IsValid)
    {
        var feed = Mapper.Map<FeedViewModel, Feed>(model);
        DAL.UpdateFeed(feed);
    }

    return View(model)
}
于 2013-05-03T13:56:02.743 に答える