抽象クラス用のカスタム バインダーを作成しました。バインダーは、使用する実装を決定します。うまくいきますが、抽象クラスに存在しないプロパティを子クラスに追加すると、常にnullになります。
以下は、抽象クラスPet
と派生クラスDog
およびのコードですCat
。
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"}
私は戻ってきます
{"talk":"Bark!","name":"Odie","species":"dog"}
にはCat
、抽象クラスには存在しないパラサイト プロパティがありますPet
。私が送れば
{"parasite":"cockroaches","name":"Oggy","species":"cat"}
私は戻ってきます
{"talk":"Miaow.","parasite":null,"name":"Oggy","species":"cat"}
他のより複雑なクラスでこれを試しましたが、これは単なる例です。デバッガーを調べたところ、parasite
値は値プロバイダーにあり、バインダーが返すモデルにはパラサイトのフィールドが含まれています。誰でも問題がどこにあるかを見ることができますか?