5

C の前にプロパティ A と B を強制的にバインドする方法はありますか?

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

私が達成しようとしているのは

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

カスタム ModelBinder で

4

2 に答える 2

1

Pageプロパティを次のように実装しないのはなぜですか。

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

于 2012-04-27T16:09:13.733 に答える
0

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))]
于 2012-04-29T14:00:48.903 に答える