C の前にプロパティ A と B を強制的にバインドする方法はありますか?
System.ComponentModel.DataAnnotations.DisplayAttribute クラスに Order プロパティがありますが、バインディングの順序に影響しますか?
私が達成しようとしているのは
page.Path = page.Parent.Path + "/" + page.Slug
カスタム ModelBinder で
C の前にプロパティ A と B を強制的にバインドする方法はありますか?
System.ComponentModel.DataAnnotations.DisplayAttribute クラスに Order プロパティがありますが、バインディングの順序に影響しますか?
私が達成しようとしているのは
page.Path = page.Parent.Path + "/" + page.Slug
カスタム ModelBinder で
Pageプロパティを次のように実装しないのはなぜですか。
public string Path{
get { return string.Format("{0}/{1}", Parent.Path, Slug); }
}
?
Path プロパティのバインディングがまったく含まれていないため、最初は Sams の回答をお勧めしました。Path プロパティを使用して値を連結すると、遅延読み込みが発生する可能性があると述べました。したがって、ドメインモデルを使用してビューに情報を表示していると思います。したがって、ビュー モデルを使用してビューに必要な情報のみを表示し (Sams answer を使用してパスを取得)、ツール ( AutoMapper など) を使用してビュー モデルをドメイン モデルにマップすることをお勧めします。
ただし、ビューで既存のモデルを引き続き使用し、モデルで他の値を使用できない場合は、他のバインディングが発生した後に、パス プロパティをカスタム モデル バインダーのフォーム値プロバイダーによって提供される値に設定できます。 (パス プロパティで検証が実行されないと仮定します)。
したがって、次のビューがあると仮定します。
@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" />
}
そして、次のビュー モデル (場合によってはドメイン モデル):
public class IndexViewModel { public string ParentPath { get; 設定; } パブリック文字列スラッグ { get; 設定; } パブリック文字列パス { 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))]