4

これは、派生クラスをインスタンス化するために使用されるカスタム モデル バインダーです。

public class LocationModalBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext,
        Type modelType)
    {
        var type = bindingContext.ModelName + "." + "type";

        Type typeToInstantiate;

        switch ((string) bindingContext.ValueProvider.GetValue(type).RawValue)
        {
            case "store":
            {
                typeToInstantiate = typeof (Store);
                break;
            }
            case "billing":
            {
                typeToInstantiate = typeof(LocationReference);
                break;
            }
            case "alternate":
            {
                typeToInstantiate = typeof(Address);
                break;
            }
            default:
            {
                throw new Exception("Unknown location identifier.");
            }
        }

        return base.CreateModel(controllerContext, bindingContext, typeToInstantiate);
    }
}

問題は、サブタイプのプロパティをバインドしないことです。基本型のプロパティのみLocation。どうしてこれなの?

4

2 に答える 2

1

return base.CreateModelあなたが試みたように、呼び出しは問題ないと思います。

return base.CreateModel行の前に次を追加して解決しました。

bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeToInstantiate);
于 2014-01-24T20:37:28.383 に答える
0

ここからこれを行いました... https://stackoverflow.com/a/9428558/221683

このタイプのモデル バインダーの例のうち、これらの割り当てなしで機能した例がどれだけあるかはわかりません。

public class LocationModalBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext,
        Type modelType)
    {
        var type = bindingContext.ModelName + "." + "type";

        Type typeToInstantiate;

        switch ((string) bindingContext.ValueProvider.GetValue(type).RawValue)
        {
            case "store":
            {
                typeToInstantiate = typeof (Store);
                break;
            }
            case "billing":
            {
                typeToInstantiate = typeof(LocationReference);
                break;
            }
            case "alternate":
            {
                typeToInstantiate = typeof(Address);
                break;
            }
            default:
            {
                throw new Exception("Unknown location identifier.");
            }
        }

        var model = Activator.CreateInstance(typeToInstantiate);

        bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeToInstantiate);
        bindingContext.ModelMetadata.Model = model;

        return model;
    }
}
于 2013-08-03T20:34:20.537 に答える