【发布时间】:2010-08-30 18:39:52
【问题描述】:
我一直在寻找这个问题的答案,我不敢相信以前没有人问过这个问题,但没有运气我在这里尝试。
我有一个注册表单,根据请求者的参与者类型而略有不同。在为解决方案编写测试时,我意识到所有动作都做同样的事情,因此我尝试使用策略模式将这些动作组合成一个。
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 中的常见属性。我之前的代码使用了正确绑定的 public ActionResult FormName(int id, FormX form) 。但是,我做了一些测试,发现如果我用 FormX 表单替换 var 表单,表单绑定并且一切正常,但是我回到了每种表单类型的一个操作。
我希望找到一种方法来使其正确绑定。 form.GetType() 返回表单的正确非基类,但我不确定如何获取构造函数,实例化一个类,然后将其放入 TryUpdateModel。我知道另一种可能性是自定义 ModelBinder,但我没有看到一种方法可以在不遇到相同 FormBase 问题的情况下创建它。
关于去哪里看有什么想法或建议吗?
【问题讨论】:
-
好吧,我想出了如何获取构造函数: var typedForm = form.GetType().GetConstructors().Where(c => c.GetParameters().Length == 0).Single ().Invoke(null);不幸的是,返回类型 Object 和 TryUpdateModel 返回更少的绑定:(
-
非常有趣:var typedForm = form as FormX; this.TryUpdateModel(typedForm, collection.ToValueProvider());作品!现在,如果我能找到一种通用的方法......
标签: asp.net-mvc-2 model-binding