7

短い質問:

オブジェクトの値をプレーンな文字列から変換するための暗黙的な変換メカニズムを提供した場合、ViewModel のプロパティに自動バインドすることはできますか?

詳細:

私はそのような複雑なオブジェクトを持っています(簡潔さと明確さのために単純化されています)

public enum PrimaryScopeEnum {
    Pivot1,
    Pivot2
}

public enum SecondaryScopeEnum {
    Entity1,
    Entity2,
    Entity3,
    Entity4
}

public class DataScope {
    public PrimaryScopeEnum PrimaryScope { get; set; }
    public SecondaryScopeEnum SecondaryScope { get; set; }

    public static implicit operator DataScope ( string combinedScope ) {
        DataScope ds = new DataScope();
        // Logic for populating Primary and Secondary Scope enums
        return ds;
    }
}

以下のように、ビューモデルで上記のオブジェクトを使用しています。

public enum PageModeEnum {
    View,
    Add,
    Edit
}

public class DisplayInfoViewModel {
    public string SetID { get; set; }
    public PageModeEnum PageMode { get; set; } 
    public DataScope Scope { get; set; }
}

そして、コントローラーのアクションは次のように設定されています

// Accessed with /MyController/DisplayInfo?SetID=22&PageMode=View&Scope=Pivot1
public virtual ActionResult DisplayInfo ( DisplayInfoViewModel vm ) {
    // vm.SetID is 22
    // vm.PageMode is PageModeEnum.View
    // vm.Scope is null
    return View ( vm );
}

私の問題はアクションにあります。文字列からクラスへの暗黙的なキャストを行ったにもかかわらず、DataScope実行中に適切にバインドできません。

渡された値 (ここでは Pivot1) を個別に使用してキャストをテストしましたが、キャストは正常に機能します。

このキャストを暗黙的に行う方法はありますか、またはビューモデルScope変数をプレーン文字列に変更してから手動でキャストする必要があります。

4

1 に答える 1

3

いいえ、デフォルトのモデルバインダーは暗黙の演算子を使用しません。タイプのカスタムモデルバインダーを作成し、DataScopeそれを機能させるには、リクエスト文字列から手動でバインドする必要があります。

例えば:

public class DataScopeModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null)
        {
            return null;
        }

        return (DataScope)value.RawValue;
    }
}

DataScope次に、これを自分のタイプに関連付けますApplication_Start

ModelBinders.Binders.Add(typeof(DataScope), new DataScopeModelBinder());
于 2013-03-11T13:37:58.583 に答える