Asp.net mvc 2 处理多个模型的MVC2操作

Asp.net mvc 2 处理多个模型的MVC2操作,asp.net-mvc-2,model-binding,Asp.net Mvc 2,Model Binding,我一直在寻找这个问题的答案,我不敢相信以前没有人问过我这个问题,但运气不好,我在这里尝试 我有一个注册表格,根据申请者的类型略有不同。在为解决方案编写测试时,我意识到所有操作都做了相同的事情,因此我尝试使用策略模式将这些操作组合成一个 public abstract class BaseForm { common properties and methods } public class Form1 : BaseForm { unique properties and overrides } .

我一直在寻找这个问题的答案,我不敢相信以前没有人问过我这个问题,但运气不好,我在这里尝试

我有一个注册表格,根据申请者的类型略有不同。在为解决方案编写测试时,我意识到所有操作都做了相同的事情,因此我尝试使用策略模式将这些操作组合成一个

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表单,表单绑定并且一切正常,但是我回到了每个表单类型的一个操作

我希望能找到一种方法把它绑好。GetType()返回表单的正确非基类,但我不确定如何获取构造函数、实例化类,然后将其放入TryUpdateModel。我知道另一种可能性是定制ModelBinder,但我看不到一种创建ModelBinder的方法不会遇到同样的FormBase问题


关于在哪里查找有什么想法或建议吗?

我试图做一些类似于Linq的事情,我试图创建一个继承一些标准字段(ID等)的类。我发现默认的Linq引擎只使用实例化类中的字段,而不使用任何继承类或接口中的字段

要构造
类型
,只需使用如下代码:

var form = Activator.CreateInstance(uiWrapper.GetForm()); 
我知道了

埃里克的回答不是解决方案,但出于某种原因,它让我想到了解决方案

我真正想要的表单是一个动态类型。如果我更改此行:

dynamic form = uiWrapper.GetForm();
一切正常:)


除此之外,logic.Save(form.ToDomainClass())也直接转到Save(DomainTypeOfForm)而不是Save(BaseDomainForm),因此我也可以避免那里的麻烦。我知道,一旦我解决了这里的问题,我也可以在我的逻辑类中应用答案。

好吧,我找到了如何获取构造函数:var typedForm=form.GetType().GetConstructors().Where(c=>c.GetParameters().Length==0.Single().Invoke(null);不幸的是,它返回的是类型对象,而TryUpdateModel返回的绑定更少:(非常有趣:var typedForm=formas FormX;this.TryUpdateModel(typedForm,collection.ToValueProvider());有效!现在,如果我能找到一种通用的方法……var form=Activator.CreateInstance(uiWrapper.GetForm().GetType());确实给了我一个表单,但不幸的是,此时它被装箱为对象,而form.Validate(this.ModelState)不再是有效的方法调用。感谢您的尝试。1)将我自己的答案标记为解决方案是否被认为是错误的表单?2) Erik,如果你使用的是C#4.0,我希望这个解决方案也能解决你的问题。记住这个答案,我完全忘记了动态,因为我刚开始一项工作,我们仍然使用3.5!