Я искал ответ на этот вопрос, о котором я не могу поверить, о нем не спрашивали раньше, но мне не повезло, что я пытаюсь здесь.MVC2 Действие для обработки нескольких моделей
У меня есть форма регистрации, которая немного отличается от того, какой тип участника является запрашивающим. При написании тестов для решения я понял, что все действия делали одни и те же вещи, поэтому я пытаюсь объединить действия в один, используя шаблон стратегии.
public abstract class BaseForm { common properties and methods }
public class Form1 : BaseForm { unique properties and overrides }
....
public class FormX : BaseForm { unique properties and overrides... in all about 5 forms }
Вот комбинированное действие:
[ModelStateToTempData, HttpPost]
public ActionResult Signup(int id, FormCollection collection)
{
uiWrapper= this.uiWrapperCollection.SingleOrDefault(w => w.CanHandle(collection));
// nullcheck on uiWrapper, redirect if null
var /*BaseForm*/ form = uiWrapper.GetForm(); // Returns FormX corresponding to collection.
this.TryUpdateModel(form, collection.ToValueProvider()); // Here is the problem
form.Validate(this.ModelState); // Multi-Property validation unique to some forms.
if (!this.ModelState.IsValid)
return this.RedirectToAction(c => c.Signup(id));
this.Logic.Save(form.ToDomainClass());
return this.RedirectToAction(c => c.SignupComplete());
}
Проблема у меня в том, что TryUpdateModel связывает только общие свойства, найденные в BaseForm. В моем предыдущем коде использовалось общедоступное ActionResult FormName (int id, FormX form), которое правильно привязывалось. Тем не менее, я провел некоторое тестирование и обнаружил, что если я заменю форму var формой FormX, форма связывается, и все работает, но я возвращаюсь к одному действию для типа формы.
Я надеюсь найти способ заставить это правильно связываться. form.GetType() возвращает правильный не-базовый класс формы, но я не уверен, как захватить конструктор, создать экземпляр класса и затем бросить его в TryUpdateModel. Я знаю, что другая возможность - это настраиваемый ModelBinder, но я не вижу способа создать его, не сталкиваясь с той же проблемой FormBase.
Любые идеи или предложения о том, где искать?
Ну, я понял, как получить конструктор: var typedForm = form.GetType(). GetConstructors(). Где (c => c.GetParameters(). Length == 0) .Single(). Invoke (ноль); Это, к сожалению, возвращает тип Object и TryUpdateModel возвращает еще меньше привязки :( – ARM
Очень интересно: var typedForm = form как FormX; this.TryUpdateModel (typedForm, collection.ToValueProvider()); работает! Теперь, если я смогу найти способ сделать это обобщенно .... – ARM