1
抽象クラス用のカスタムバインダーを作成しました。バインダーは、使用する実装を決定します。 正常に動作しますが、抽象クラスに存在しないプロパティを子クラスに追加すると、常にnullになります。派生抽象クラスのJSONカスタムバインダーnull asp.net mvc
抽象クラス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"}
を送信する場合、私は戻ってCat
については
{"talk":"Bark!","name":"Odie","species":"dog"}
を取得し、抽象クラスPet
に存在しない寄生虫のプロパティがあります。私は
{"parasite":"cockroaches","name":"Oggy","species":"cat"}
を送信する場合、私は他のより複雑なクラスでこれを試してみましたバック
{"talk":"Miaow.","parasite":null,"name":"Oggy","species":"cat"}
取得、これは単純な例です。 私はデバッガを見て、値プロバイダにはparasite
の値があり、バインダが返すモデルには寄生虫のフィールドが含まれています。 問題がどこに誰に見えるのですか?
おかげで、。 – semaz