asp.net c中的动态表单创建#
因此,我需要对asp.net(c#)应用程序进行一些输入重构,该应用程序基本上是用于创建动态表单(任何表单)的框架。从高层次的角度来看,有一个表包含表单,然后有一个表包含所有表单字段,两者之间是一对多。有一个验证表,其中每个字段可以有多种类型的验证,从表单字段表到验证表是一对多的 因此,问题是,该应用程序已作为可定制的解决方案销售给所有客户。因此,无论他们想要什么形式,我们都可以使用DB配置构建jsut。问题是,这并不总是可能的,因为字段之间存在复杂的关系,表单本身之间也存在复杂的关系。而且,只有一个代码库,这是针对多个客户机的——所有客户机都自己托管代码库。每个客户端都有非常特定的逻辑,它们都在同一个代码库中,没有真正的分离。有时很难将其通用化,因此在某些情况下,它具有硬编码逻辑(例如,如果formID=XXX,那么do u2;)。您也可以有嵌套表单,如中所示,每个表单中都有一组字段 因此,通常,当一个客户端请求更改时,我们进行更改并将其部署到该客户端-但是另一个客户端请求不同的更改,我们进行更改并将其部署到该客户端,但是来自早期客户端的更改破坏了它,并且尝试调试是一件令人头痛的事情,因为一切都是动态的。我们无法回滚之前的更改,因为这样其他客户机就会崩溃 它不是在真正的三层体系结构中完成的——它是一个引用DB类和类库的网站。网站本身、类库和数据库存储过程中都有业务逻辑(验证在存储过程中完成) 我负责重新组织整个事件,以下是我的想法/问题:asp.net c中的动态表单创建#,asp.net,vb.net,web-applications,dynamic,webforms,Asp.net,Vb.net,Web Applications,Dynamic,Webforms,因此,我需要对asp.net(c#)应用程序进行一些输入重构,该应用程序基本上是用于创建动态表单(任何表单)的框架。从高层次的角度来看,有一个表包含表单,然后有一个表包含所有表单字段,两者之间是一对多。有一个验证表,其中每个字段可以有多种类型的验证,从表单字段表到验证表是一对多的 因此,问题是,该应用程序已作为可定制的解决方案销售给所有客户。因此,无论他们想要什么形式,我们都可以使用DB配置构建jsut。问题是,这并不总是可能的,因为字段之间存在复杂的关系,表单本身之间也存在复杂的关系。而且,只
哦,还有“帮助!”我有许多类似的应用程序,用于构建我支持的动态表单 有很多事情你可以做/不能做&在扔掉3年的测试/开发之前,你好好想想是对的 我想让你考虑的是在你所得到的基础上实现一个插件体系结构。表单的任何自定义代码都会进入插件&该插件的名称与表单一起存储。生成表单时,将调用正确的插件以增强基本功能。这样就可以将所有自定义代码移出现有库。它还应该意味着更少的破坏性更改,每个插件只影响它所附加到的表单
从那时起,重构核心引擎就很容易了,因为它是所有客户机和表单的通用功能。我当前的项目听起来几乎与您描述的产品完全相同。幸运的是,我从以前的一款产品中学到了最难的一课,因此我能够从头开始我当前的项目。你也许应该通读一遍,它描述了我的经历,以及我学到的教训 最重要的是要关注你正在构建一个产品的想法。如果您无法找到使用当前产品功能集实现特定功能的方法,则需要花一些额外的时间考虑如何将此自定义一次性功能转变为可配置功能,从而使所有(或至少许多)客户受益 因此:
{Type:"FormDefinition",
EntityType: "Customer",
Fields: [
{FieldName:"CustomerName",
FieldType:"String",
Validations:[
{ValidationType:"Required"},
{ValidationType:"StringLength", Minimum:15, Maximum:50},
]},
...
{FieldName:"CustomerType",
FieldType:"Dropdown",
PossibleValues: ["Standard", "Valued", "Gold"],
DefaultValue: ["Standard"]
Validations:[
{ValidationType:"Required"},
{
ValidationType:"Custom",
ValidationClass:"MySystem.CustomerName.CustomValidations.CustomerStatus"
}
]},
...
]
};
namespace System.CustomerName.CustomValidations {
class CustomerStatus: IValidator {
private FormContext form;
private List<ValidationErrors> validationErrors;
CustomerStatus(FormContext fc) {
this.validationErrors = new List<ValidationErrors>();
this.form = fc;
}
public List<ValidationErrors> Validate() {
if (this.formContext.Fields["CustomerType"] == "Gold" && Int.Parse(this.form.Fields["OrderCount"]) < 10) {
this.validationErrors.Add(new ValidationError("A gold customer must have at least 10 orders"))
}
if (this.formContext.Fields["CustomerType"] == "Valued" && Int.Parse(this.form.Fields["OrderCount"]) < 5) {
this.validationErrors.Add(new ValidationError("A valued customer must have at least 5 orders"))
}
return this.validationErrors;
}
}
}
{Type:"Record",
EntityType: "Customer",
Fields: [
{FieldName:"CustomerName", Value:"ABC Corp.",
{FieldName:"CustomerType", Value:"Gold",
...
]
};