代码之家  ›  专栏  ›  技术社区  ›  ARM

处理多个模型的MVC2操作

  •  0
  • ARM  · 技术社区  · 14 年前

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

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

    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问题的情况下创建它。

    有什么想法或建议可以去哪里看看吗?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Erik Philips Gabriel Costa    14 年前

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

    构建一个 Type 只需使用如下代码:

    var form = Activator.CreateInstance(uiWrapper.GetForm()); 
    
        2
  •  0
  •   ARM    14 年前

    我明白了!

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

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

    dynamic form = uiWrapper.GetForm();
    

    一切正常:)

    除此之外,logic.save(form.todomainclass())还直接指向save(domaintypeofform),而不是save(basedomainform),因此我也可以避免那里的头疼。我知道一旦我解决了这里的问题,我也可以在我的逻辑课上应用答案。