14

ページに多数の数学的なチェックがあるアプリケーションがあり、それに従って、ユーザーに信号 (赤、緑、黄) が与えられます。

緑 = 続行してもよい
赤 = 続行させない
黄色 = 続行は許可するが警告する

これらの数式は、ページ上のさまざまなテキスト フィールドで機能します。たとえば、textbox1 が "10" で texbox2 が "30" の場合、式は次のようになります:
T1 * T2 > 600 ? 「緑」:「赤

私の質問は次のとおり
です。これらの式をどうにかして一元化することは可能ですか?

なぜそれが必要なのですか?
現時点では、数式に変更があった場合、サーバー側でも変更を複製する必要があります (DRY 違反、コードの保守が困難)

1 つのオプションは
次のとおりです - (単純な) 数式をプレースホルダー付きのテキストとして config(?) に
保存します - プレースホルダーを JavaScript およびサーバー側コードの値に置き換えます
- JS での計算に eval() を使用します -
概説されたトリックを使用しますC#についてはこちら

このアプローチの問題は、JS と C# の同じ数学文字列の異なる解釈である可能性があります。

私は理にかなっていますか、それともこの質問を報告する必要がありますか?!! :P

4

5 に答える 5

2

アプリケーションの要件によっては、サーバー上ですべての検証を行うだけでよい場合があります。特に、ユーザーがほとんどいない場合、またはほとんどのユーザーがかなり高速なイントラネットを使用している場合は、ネットワーク呼び出しを「無駄」にして、メンテナンスの手間を省くことができます。

ユーザーがすべてのフィールド エントリ間 (または数エントリごと、または数秒ごと) にフィードバックが必要な場合は、AJAX 呼び出しを使用して、ページ全体を更新せずにサーバーに検証を要求できます。

もちろん、これにより、クライアントで完全に検証を行うよりも多くのリクエストが発生します。また、多くのユーザーのネットワーク接続が悪い場合、フィードバックを提供する際に遅延が発生する可能性があります。私の推測では、総帯域幅の使用量はほぼ同じです。検証のラウンドトリップごとにいくつか使用しますが、それらは小さいです。クライアントに送信しないすべての検証 JS がそれを上回る可能性があります。

主な利点は、クライアントとサーバーの検証を同期させておく必要があるメンテナンスと FUD です。また、検証 JavaScript を記述する必要がないため、時間の節約にもなります。

いずれにせよ、一歩下がって、あなたの要件が何であるかを尋ねる価値があるかもしれません.

于 2013-01-25T03:42:22.437 に答える
0

最も簡単な解決策は、C# サーバー側で数式を一度実装し、変更が行われたときに AJAX を使用してクライアントからの式を評価することです。これにより、ページが遅くなる可能性があります。

数式をクライアント側とサーバー側で評価するが、一度だけ記述したい場合は、次のようなことをする必要があると思います:

  • 式を別のクラスに引き出します
  • クライアント側の場合:
  • サーバー側の場合:
    • Formulas クラスを呼び出し、フォーム データ (または Web フォームの場合はコントロール) から値を渡します。
    • 数式の結果を使用して必要なアクションを実行します

.. または、その逆を行い、式を Javascript で記述し、C# Javascript エンジンを使用してそのコードをサーバー側で評価することもできます。

他のいくつかの回答で示唆されているように、カスタム式言語を書いたり、C# を Javascript に変換するためのコードを書いたりするのに時間をかけません。私がリンクした質問に示されているように、これらはすでに存在しています。これは、ビジネス上の問題から気をそらすものです。私は、他の誰かの仕事に適合し、その恩恵を受ける既存のソリューションを見つけるでしょう。

于 2013-01-25T16:41:57.590 に答える
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

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 に答える