1

私は、大学の電子メール システム用に構築しているサイトで、ユーザー アカウント システム用のマルチタイプのユーザー プロファイル エディターに取り組んでいます。

クラス から継承する3 つの ビュー モデル がありAdministratorます 。それらを使用してビューに表示すると、正しいエディターが正常に表示されますが、コントローラーに変更を送信すると、正しい送信されたビュー モデル クラスではなく、基本クラスとして解決されます (Visual Studio デバッガーを使用してこれを確認しました)。そのため、アクション メソッドに到達すると、重要なエディター データが失われます。モデルタイプごとに完全に個別のビューを作成せずに、これをコントローラーにポストするときに適切なタイプを解決するにはどうすればよいですか?FacultyStudentPersonEditorForModel()

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 に答える