MVC2用于处理多个模型的Action

时间:2010-08-30 18:39:53

标签: asp.net-mvc-2 model-binding

我一直在四处寻找这个问题的答案,我以前没有问过这个答案,但是没有运气我在这里尝试。

我有一个注册表单,根据请求者的参与者类型略有不同。在为解决方案编写测试时,我意识到所有操作都做了同样的事情,因此我尝试使用策略模式将操作合并为一个。

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表单)。但是,我做了一些测试,发现如果我用FormX格式替换var形式,那么形式绑定并且一切正常,但我回到每个表单类型一个动作。

我希望找到一种方法让它正确绑定。 form.GetType()返回表单的正确非基类,但我不知道如何获取构造函数,实例化一个类,然后将其抛入TryUpdateModel。我知道另一种可能性是自定义的ModelBinder,但我没有看到一种创建方法而没有遇到同样的FormBase问题。

关于在哪里寻找的任何想法或建议?

2 个答案:

答案 0 :(得分:0)

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

构建Type只需使用以下代码:

var form = Activator.CreateInstance(uiWrapper.GetForm()); 

答案 1 :(得分:0)

我明白了!

Erik的答案不是解决方案,但出于某种原因,它让我想到了解决方案。

我真正想要的形式是动态类型。如果我改变这一行:

dynamic form = uiWrapper.GetForm();

一切正常:)

除此之外,logic.Save(form.ToDomainClass())也直接转到Save(DomainTypeOfForm)而不是Save(BaseDomainForm),所以我也可以避免那里的头痛。我知道,一旦我在这里找到问题,我也可以在逻辑课程中应用答案。