14

我们有一个应用程序,它在页面上有很多数学检查,根据它,给用户一个红绿灯(红、绿、黄)。

绿色 = 他可以继续
红色 = 不要让他继续
黄色 = 允许继续但警告

这些公式对页面上的各种文本字段进行操作。因此,例如,如果 textbox1 有“10”而 texbox2 有“30”......公式可能是:
T1 * T2 > 600 ?“绿色”:“红色

我的问题是:
是否有可能以某种方式集中这些公式?

为什么我需要它?
现在,如果公式有任何更改,我们也必须在服务器端复制更改(违反 DRY,代码难以维护)

一种选择可能是
- 将(简单)公式存储为带有占位符的文本在配置(?)中
- 用 javascript 中的值以及服务器端代码替换占位符
- 在 JS 中使用 eval() 进行计算
- 使用概述的技巧这里是 C#

在这种方法中,问题可能是 JS 和 C# 中相同数学字符串的不同解释。

我有道理还是应该报告这个问题?!:P

4

5 回答 5

2

根据您的应用程序的要求,只在服务器上进行所有验证可能是可以接受的。特别是如果您的用户很少或大多数用户都在相当快的 Intranet 上,您可以“浪费”一些网络调用来省去维护上的麻烦。

如果用户想要在每个字段条目(或每隔几个条目,或每隔几秒)之间获得反馈,您可以使用 AJAX 调用来请求服务器进行验证,而无需刷新整个页面。

当然,这将导致比完全在客户端上进行验证更多的请求,并且如果您的许多用户的网络连接不良,则在向他们提供反馈时可能会有延迟。我的猜测是总带宽使用量大致相同。您在每次验证往返时都使用一些,但这些都很小。您不会发送给客户端的所有验证 JS 可能会超过它。

主要好处是维护和 FUD,否则您将保持客户端和服务器验证同步。不必编写验证 javascript 也可以节省时间。

无论如何,可能值得退后一步,询问您的要求是什么。

于 2013-01-25T03:42:22.437 回答
0

Microsoft.CSharp.CSharpCodeProvider提供程序可以即时编译代码。特别是,请参阅CompileAssemblyFromFile

例如,这将允许您在运行时从 web.config 执行代码;但是请谨慎使用。

于 2013-01-22T20:36:41.803 回答
0

您可以编写 C# 类来使用 Expression、Value、BooleanExpr 等类对表达式进行建模(抽象语法树)

例如

Expression resultExpression = new ValueOf("T1").Times(new ValueOf("T2")).GreaterThan(600).IfElse("RED","GREEN")
                                    ^Variable              ^Variable        ^Value=>BoolExpr   ^(Value, Value) => Value

然后可以使用这些表达式在 C# 中进行评估并发出用于检查的 Java 脚本:

String result = resultExpression.bind("T1", 10).bind("T2",20).evaluate() //returns "RED"
String jsExpression resultExpression.toJavaScript // emits T1 * T2 > 600 ? "RED" : "GREEN"
于 2013-01-23T07:26:01.993 回答
0

您可以创建一个低级计算器类,该类使用字符串作为输入并将事物推送和弹出到堆栈中。查找“逆波兰计算器”。如果您使用的输入数量没有改变,这将是一种非常巧妙的方式来存储您的方程。您将能够非常轻松地将它们存储在文本文件或配置文件中。

例如:

string Equation = "V1,V2,+";

string ParseThis = Equation.Replace("V1", "34").Replace("V2", "45");

foreach(string s in ParseThis.split(',')) {
   if (s == "+") {
     val1 = stack.Pop();
     val2 = stack.Pop();
     return int.parse(val1) + int.Parse(val2);
   }
   else {
     stack.Push(s);
   }
}

显然,使用不同的方程式会变得更加复杂,但它可以让您将方程式存储为您想要的任何地方的字符串。

如果任何语法不正确,我们深表歉意,但这应该会让您朝着正确的方向前进。

于 2013-01-24T15:51:46.423 回答
0

最简单的解决方案是在 C# 服务器端实现一次公式,并在进行更改时使用 AJAX 评估来自客户端的表达式。这可能会减慢页面速度。

如果您希望在客户端和服务器端评估公式但只编写一次,那么我认为您需要执行以下操作:

  • 将公式拉到一个单独的类中
  • 对于客户端:
  • 对于服务器端:
    • 调用公式类,传入表单数据中的值(或控件,如果这是网络表单)
    • 使用公式的结果采取必要的行动

.. 或者您可以反过来,用 Javascript 编写公式,然后使用C# Javascript 引擎在服务器端评估该代码。

正如其他一些答案所建议的那样,我不会花时间编写自定义表达式语言,或编写将 C# 转换为 Javascript 的代码。如我链接到的问题所示,这些已经存在。这会分散您对业务问题的注意力。我会找到一个适合并从其他人的工作中受益的现有解决方案。

于 2013-01-25T16:41:57.590 回答