2012-04-27 19 views
5

Cの前にプロパティAとBを強制的にバインドする方法はありますか?ASP.NET MVC(4) - 特定の順序でプロパティをバインドする

System.ComponentModel.DataAnnotations.DisplayAttributeクラスにOrderプロパティがありますが、バインド順序に影響しますか?

public string Path{ 
    get { return string.Format("{0}/{1}", Parent.Path, Slug); } 
} 

:私が達成しようとしている何

は、カスタムModelBinder

+0

'page.Parent.Path'と' page.Slug'がフォームからバインドされており、 'page.Path'をバインド直後にコンテンツの連結に設定したいと言うのは正しいでしょうか?つまり、 'page.Path'の値はフォーム上に存在しません。 – Dangerous

+0

@Dangerous correct、 'page.Path'はフォームにありません。私は 'page.Parent.Id'と' page.Slug'をフォームから取得します。 –

+0

そして、 'page.Parent'と' page.Slug'の後に 'page.Path'を構築したいと思います。 –

答えて

0

私は、Pathプロパティのバインドにまったく関与していなかったので、Samsの答えを最初に推奨していました。 Pathプロパティを使用して値を連結すると、レイジーローディングが発生する可能性があることに言及しました。したがって、ドメインモデルを使用してビューに情報を表示していると思います。したがって、ビューモデルを使用してビューに必要な情報のみを表示し(Samsアンサーを使用してパスを取得する)、ビューモデルをツール(つまりAutoMapper)を使用してドメインモデルにマッピングすることをおすすめします。

ただし、ビューで既存のモデルを引き続き使用し、モデル内の他の値を使用できない場合は、カスタムモデルバインダーのフォーム値プロバイダーが提供する値にpathプロパティを設定できます。他のバインドが発生しています(パスプロパティに対して検証を実行しないと仮定します)。

@using (Html.BeginForm()) 
{ 
    <p>Parent Path: @Html.EditorFor(m => m.ParentPath)</p> 
    <p>Slug: @Html.EditorFor(m => m.Slug)</p> 
    <input type="submit" value="submit" /> 
} 

そして、次のビューモデル(または場合によってはドメインモデル)::

パブリッククラスIndexViewModel { パブリック文字列ParentPath {

だからあなたは次のビューを持っていると仮定することができます取得する;セット; } 公開ストリングSlug {get;セット; } パブリック・ストリングPath {get;セット; } }

その後、次のモデルバインダー指定することができます。

public class IndexViewModelBinder : DefaultModelBinder 
    { 
     protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      //Note: Model binding of the other values will have already occurred when this method is called. 

      string parentPath = bindingContext.ValueProvider.GetValue("ParentPath").AttemptedValue; 
      string slug = bindingContext.ValueProvider.GetValue("Slug").AttemptedValue; 

      if (!string.IsNullOrEmpty(parentPath) && !string.IsNullOrEmpty(slug)) 
      { 
       IndexViewModel model = (IndexViewModel)bindingContext.Model; 
       model.Path = bindingContext.ValueProvider.GetValue("ParentPath").AttemptedValue + "/" + bindingContext.ValueProvider.GetValue("Slug").AttemptedValue; 
      } 
     } 
    } 

をそして最後に、このモデルバインダーは、ビューモデルに、次の属性を使用して、使用することを指定します。

[ModelBinder(typeof(IndexViewModelBinder))] 
1

なぜとしてページのプロパティを実装しないで

page.Path = page.Parent.Path + "/" + page.Slug 

のですか?

+0

これは、すべてのページの祖先を1つずつ遅延ロードする原因になります。例えば。階層に3つのページ(それぞれレベル3)を表示すると、データベースへの追加の20の問合せが発生する可能性があります。 –

関連する問題