我一直在四处寻找这个问题的答案,我以前没有问过这个答案,但是没有运气我在这里尝试。
我有一个注册表单,根据请求者的参与者类型略有不同。在为解决方案编写测试时,我意识到所有操作都做了同样的事情,因此我尝试使用策略模式将操作合并为一个。
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问题。
关于在哪里寻找的任何想法或建议?
答案 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),所以我也可以避免那里的头痛。我知道,一旦我在这里找到问题,我也可以在逻辑课程中应用答案。