2011-08-01 7 views
1

抽象クラス用のカスタムバインダーを作成しました。バインダーは、使用する実装を決定します。 正常に動作しますが、抽象クラスに存在しないプロパティを子クラスに追加すると、常にnullになります。派生抽象クラスのJSONカスタムバインダーnull asp.net mvc

抽象クラスPetと派生クラスDogCatのコードは次のとおりです。

public abstract class Pet 
{ 
    public string name { get; set; } 
    public string species { get; set; } 
    abstract public string talk { get; } 
} 

public class Dog : Pet 
{ 
    override public string talk { get { return "Bark!"; } } 
} 
public class Cat : Pet 
{ 
    override public string talk { get { return "Miaow."; } } 
    public string parasite { get;set; } 
} 


public class DefaultPetBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Type modelType) 
    { 
     bool hasPrefix = bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName); 
     string prefix = ((hasPrefix)&&(bindingContext.ModelName!="")) ? bindingContext.ModelName + "." : ""; 

     // get the parameter species 
     ValueProviderResult result; 
     result = bindingContext.ValueProvider.GetValue(prefix+"species"); 

     if (result.AttemptedValue.Equals("cat")){ 
      //var model = base.CreateModel(controllerContext, bindingContext, typeof(Cat)); 
      return base.CreateModel(controllerContext,bindingContext,typeof(Cat)); 
     } 
     else (result.AttemptedValue.Equals("dog")) 
     { 
      return base.CreateModel(controllerContext,bindingContext,typeof(Dog)); 
     } 
    } 
} 

コントローラは、Petパラメータを受け取り、それをJSONとして返します。

私は

{name:"Odie", species:"dog"} 

を送信する場合、私は戻ってCatについては

{"talk":"Bark!","name":"Odie","species":"dog"} 

を取得し、抽象クラスPetに存在しない寄生虫のプロパティがあります。私は

{"parasite":"cockroaches","name":"Oggy","species":"cat"} 

を送信する場合、私は他のより複雑なクラスでこれを試してみましたバック

{"talk":"Miaow.","parasite":null,"name":"Oggy","species":"cat"} 

取得、これは単純な例です。 私はデバッガを見て、値プロバイダにはparasiteの値があり、バインダが返すモデルには寄生虫のフィールドが含まれています。 問題がどこに誰に見えるのですか?

答えて

5

このようにしてみてください。完全に働いた

protected override object CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Type modelType) 
{ 
    bool hasPrefix = bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName); 
    string prefix = ((hasPrefix)&&(bindingContext.ModelName!="")) ? bindingContext.ModelName + "." : ""; 

    // get the parameter species 
    ValueProviderResult result; 
    result = bindingContext.ValueProvider.GetValue(prefix+"species"); 

    if (result.AttemptedValue.Equals("cat")) 
    { 
     var model = Activator.CreateInstance(typeof(Cat)); 
     bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(Cat)); 
     return model; 
    } 
    else if (result.AttemptedValue.Equals("dog")) 
    { 
     var model = Activator.CreateInstance(typeof(Dog)); 
     bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(Dog)); 
     return model; 
    } 

    throw new Exception(string.Format("Unknown type \"{0}\"", result.AttemptedValue)); 
} 
+0

おかげで、。 – semaz

関連する問題