1

我正在为我正在为大学电子邮件系统构建的网站上的用户帐户系统开发多类型用户配置文件编辑器。

我有 3 个视图模型Administrator, 它们从一个Faculty类 继承。当它们使用它们显示在视图中时,它们显示正确的编辑器就好了,但是当我向控制器提交更改时,它们被解析为基类(我已经使用 Visual Studio 调试器验证了这一点)而不是正确提交的视图模型类。因此,当它到达操作方法时,我会丢失重要的编辑器数据。在将其发布回控制器而不为每种模型类型创建完全独立的视图时,如何使其解析正确的类型?StudentPersonEditorForModel()

4

2 回答 2

1

我想出了以下解决方案:

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-04T13:18:06.583 回答
0

您确定您在操作方法中所期望的模型不是 Person 类型吗?这可能会导致您出现问题。

于 2013-04-03T23:15:59.753 回答