2016-10-03 2 views
0

これは私の最初の大規模なMVCアプリケーションであるため、MVCでこれが可能か、正確には何が標準的なものかを知る必要があります。ViewModelを使用してMVCフォームを設定しますが、ポストバックのビューモデルのオブジェクトにバインドします。これは可能ですか?

だから私は持っている

public class Tier2IssueFormViewModel 
{ 
    public Tier2IssueDTO Tier2Issue { get; set; } 
    public IEnumerable<SelectListItem> VersionList { get; set; } 
    public IEnumerable<SelectListItem> BugList { get; set; } 
    public IEnumerable<SelectListItem> IssueStatusList { get; set; } 
} 

それから私は、ユーザーが編集すると、そのフォームのページに、私は私がのviewmodelに持ってる必要なすべての必要なデータをプルアップすることができるようにしたいフォーム、私は、

@Html.TextBoxFor(m => m.Tier2Issue.Tier2Notes, new { @class = "form-control"}) 
@Html.DropDownListFor(m => m.Tier2Issue.FishbowlVersion, Model.VersionList, "Select Application Version") 
@Html.HiddenFor(m => m.Tier2Issue.ID) 

が、私は私のモデルにバインドするため、次のシグネチャを持つ、このアクションに戻って投稿したい、のようなものを使用して、ユーザーからのフォームデータを収集し終わったら

[HttpPost] 
[Route("Issues/{id}/Edit")] 
public ActionResult EditIssue(Tier2IssueDTO model) 
{ 
    ... 
    // Update DB with the DTO model 
    ... 
} 

これまでのところ、何も実際にこのオブジェクトにバインドされていません。私は、モデルのバインダーが2つのペアを作るのに十分にスマートかもしれないと思ったが、私はこの論理が間違っていると推測している。だから私は現在、これを使用して回避策をやっている、

[HttpPost] 
[Route("Issues/{id}/Edit")] 
public ActionResult EditIssue(Tier2IssueFormViewModel model) 
{ 
    ... 
    // Get Tier2IssueDTO values from viewmodel 
    // Update DB with the DTO model 
    ... 
} 

私はそれが動作を意味するが、あなたがビューモデルにバインドをモデル化するだろうと私には奇妙に思えます。この標準的なプラクティスですか、またはビューモデルに含まれるオブジェクトに直接バインドする方法はありますか?

+0

動作させる必要がありますモデルは 'Tier2IssueFormViewModel'であり、' HtmlHelper'メソッドは 'Tier2IssueDTO'ではなくそのモデルに基づいてフォームコントロールを生成しています(' name'属性を見てください)。あなたは 'BindAttribute'の' Prefix'プロパティを使用することができますが、あなたはこれを正しく実行しません。ビューモデルは、特にデータを編集するときに、データモデルを含むべきではありません。 –

+0

@StephenMueckeビューモデルにデータモデルを持たない場合は、編集するオブジェクトのデータをどのように表示するのですか?オブジェクトには既に値があり、その値を表示して変更する方法です。代替手段は何ですか? – tokyo0709

+0

ビューモデルには、編集するデータモデルのプロパティ(データモデル自体ではない)と選択リストなどのプロパティを含める必要があります - [MVCでViewModelとは何ですか](http://stackoverflow.com/questions/11064316/what -is-viewmodel-in-mvc) –

答えて

1

入力テキストボックスの名前は、あなたの行動の内部モデルからdifferntているので、これは動作しません、例:あなたのアクションでモデルパラメータのみTier2Issueなしプロパティ名Tier2Notesを期待している間に、テキストボックスには、名前Tier2Issue.Tier2Notesを持っています接頭辞。あなたはどちらかのアクションパラメータと同じモデルを作ることによって、この問題を克服するか、テキストボックス、元に明示的な名前と値を与えることができます

@Html.TextBox("Tier2Notes",Model.Tier2Issue.Tier2Notes, new { @class = "form-control"}) 

これは

0

あなたはその権利を持っています。 viewmodel、dto、entityがすべて同じプロパティを持つように見えることはよくありますが、それらはすべて異なる仕事をしますが、通常は少しばらつきます。 dtoはビューモデルとして機能することができますが、丸い穴の中に四角いペグです。オートマッペを使ってこれらのオブジェクトを他のオブジェクトにマッピングしていないのであれば(これは考えられるかもしれませんが、広く共有されているかもしれません)、automapperを使用してあなたに敬遠するキーストロークを保存します。

関連する問題