[英]Custom model binder for complex model with collection of polymorphic objects
如何為具有多態對象集合的復雜模型編寫自定義模型綁定器?
我有模型的下一個結構:
public class CustomAttributeValueViewModel
{
public int? CustomAttributeValueId { get; set; }
public int CustomAttributeId { get; set; }
public int EntityId { get; set; }
public CustomisableTypes EntityType { get; set; }
public string AttributeClassType { get; set; }
}
public class CustomStringViewModel : CustomAttributeValueViewModel
{
public string Value { get; set; }
}
public class CustomIntegerViewModel : CustomAttributeValueViewModel
{
public int Value { get; set; }
}
如果我想將CustomAttributeValueViewModel綁定到其中的某些繼承者,則可以使用以下自定義模型綁定器:
public class CustomAttributeValueModelBinder : DefaultModelBinder
{
protected override object CreateModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext,
Type modelType)
{
if (modelType == typeof(CustomAttributeValueViewModel))
{
var attributeClassType = (string)bindingContext.ValueProvider
.GetValue("AttributeClassType")
.ConvertTo(typeof(string));
Assembly assembly = typeof(CustomAttributeValueViewModel).Assembly;
Type instantiationType = assembly.GetType(attributeClassType, true);
var obj = Activator.CreateInstance(instantiationType);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, instantiationType);
bindingContext.ModelMetadata.Model = obj;
return obj;
}
return base.CreateModel(controllerContext, bindingContext, modelType);
}
}
效果很好。 但是現在我想將這些模型綁定為另一個模型的集合項。 例如:
public class SomeEntity
{
// different properties here
public IList<CustomAttributeValueViewModel> CustomAttributes { get; set; }
}
我怎樣才能做到這一點?
編輯:
我想綁定我從客戶端收到的發布數據。 為了更加清楚,這是我的POST HTTP請求的示例:
POST someUrl HTTP/1.1
User-Agent: Fiddler
Host: localhost
Content-Type: application/json; charset=utf-8
Content-Length: 115
{
"ProductName": "Product Name",
"CustomAttributeValues": [
{
"CustomAttributeId": "1",
"Value": "123",
"AttributeClassType": "namespace.CustomStringViewModel"
}
]
}
我在行動中收到以下數據:
public void Save([ModelBinder(typeof(SomeBinder))] SomeEntity model)
{
// some logic
}
我想寫這樣的活頁夾,以獲取繼承的集合。
您需要包含AttributeClassType
完整路徑,
var valueProviderResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName + ".AttributeClassType");
請看一下這個工作的Github示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.