2017-02-10 7 views
2

大きなエンティティ(組織)があり、いくつかのViewModelを持つフィールドのサブセットが小さい別々のビューにいくつかのフィールドを分割しました。後でこれらのフィールドを更新する必要がある場合は、同じビューを使用したいと思います。ビューモデルを使用してビューから編集する方法

どのようにデータを入力するのか混乱しています。例えば、私は(おそらく愚かなことに)私がEntity全体にGetを実装した場合、フィールド全体が自動的に入力されると思っていました。つまり、エンティティ全体に関連付けられた編集ビューを使用しているかのようです。

ViewModelsをこのように使用すべきでない場合、または私が何か明白なことについて考えていない場合は誰かに教えてください。

ここに私の(おそらく貧弱な)仮定に基づいて私の現在のGet/Postがあります。 CompanyInfoは、組織内のフィールドのサブセットです。これは私に不満な "動的なプロキシ"エラーを与えます。 ASP.NET MVCで1 ViewModelにを有する唯一の本当の問題は、あなたがそれをポストバックするときに、状態として、あなただけだ、以来、あなたはプロパティビューによって移入されているかわからないということです

// GET: /Organization/CompanyInfo 
public ActionResult CompanyInfo(ManageMessageId? message) 
{ 
    ViewBag.StatusMessage = 
    message == ManageMessageId.ConfirmEmail ? "Please confirm your email address to log in again." : ""; 

    var member = GetUserMember(); 
    var org = db.Organizations.Single(x => x.OrgId == member.OrgId); 

    return View(org); 
} 

// 
// POST: /Organization/CompanyInfo 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> CompanyInfo(CompanyInfoViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var member = GetUserMember(); 
     var org = await db.Organizations.SingleAsync(x => x.OrgId == member.OrgId); 
     org.StreetAddress = model.StreetAddress; 
     org.Suite = model.Suite; 
     org.City = model.City; 
     org.State = model.State; 
     org.Zip = model.Zip; 
     org.Country = model.Country; 
     db.Entry(org).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("CompanyInfo", "Organization"); 
    } 
    return View(); 
} 
+1

CompanyInfoアクションは、dbエンティティ自体ではなく、CompanyInfoViewModelを返す必要があります(場合によってはが実際にという複雑な処理を行う必要があります)。このVMを作成して表示するには、組織データを使用する必要があります。あなたの投稿アクションはうまく見えます。 –

答えて

0

さまざまなビューにそれらのサブセットを設定します。あなたが理想的に従うべきパターンは、各ビューのための1つのViewModelを持っているということです(このポストの最初のコメントは、あなたのモデルではなく、それをビューに渡して最初から始めるべきだと言いました)。

エンティティのさまざまな部分を処理しているため、それぞれのビューには異なる検証要件があるため、注釈付き検証が組み込まれています。

また、ASP.NET MVCでViewModelについて説明するとき、XAMLベースのUIフレームワークでViewModelと同じことを話しているわけではなく、KnockoutやAngular 2などのJavaScriptライブラリでも同じことを言及したいと思います。これらViewModelのcanクライアント上に存在する性質のためビューとアプリケーション間で共有することができます。つまり、消費時にビューに対してビジネスロジックを実行することができます。

0

あなたの問題は、私は賭けたいた、あなたのCompanyInfo(ManageMessageId? message)アクションメソッドがdb.Organizations.Single(x => x.OrgId == member.OrgId)を返すということですがタイプOrganization(か何か)であり、間違いなくないタイプCompanyInfoViewModelの。

orgオブジェクトデータのうち、最初の方法でCompanyInfoViewModelを作成する必要があります。


このシナリオではView Modelを使用できますが、一般的にはDTOと呼ばれます。 (データ転送オブジェクト)アクションの場合は____ViewModelEditアクションの場合は____EditModelなどと一般的に呼ばれます。これらのオブジェクトはであり、ViewModelオブジェクトではありません。他の操作用です。

関連する問題