我想出了以下解決方案:
public class InheritanceBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var modelType = bindingContext.ModelType;
object model = modelType.Assembly.CreateInstance(modelType.FullName);
var inheritedtypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => model.GetType().IsAssignableFrom(t)).ToList();
HttpRequestBase req = controllerContext.HttpContext.Request;
var keys = req.Form.Keys.Cast<string>().Where(q => q != "__RequestVerificationToken").ToList();
List<KeyValuePair<Type, int>> matches = new List<KeyValuePair<Type,int>>();
inheritedtypes.ForEach(t => {
int p_matches = 0;
Array.ForEach(t.GetProperties(), item =>
{
if (keys.Any(key => item.Name == key))
p_matches++;
});
matches.Add(new KeyValuePair<Type, int>(t, p_matches));
});
var bestmatches = matches.Where(q => q.Value == matches.Max(s => s.Value));
if (!bestmatches.Any())
throw new TargetInvocationException("Could not determine model to bind based on the form values provided", null);
var usematch = bestmatches.First().Key;
object bindObj = Activator.CreateInstance(usematch);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => bindObj, usematch);
return base.BindModel(controllerContext, bindingContext);
}
}
你將毫無疑問必須寫用於此目的的自定義模型粘合劑。 – 2013-04-03 23:29:30
如果你不能在不編寫自定義模型綁定器的情況下使用inherted類型,那麼使用editorfor有什麼意義呢 – 2013-04-03 23:36:45
這不是'EditorFor'調用,它決定了傳遞給Action方法的內容..當Model Binder查看它說的方法:「哦,看,一個'人'對象,我會創建其中一個......」。請記住,所有服務器正在接收的是表單發佈值。沒有(默認)方式通知客戶端編輯器模板類型。 – 2013-04-03 23:39:48