0

算術式をデータベースに保存したいと思っています。私はこのdb構造を持っています:

Expression
=======
id
name

Operand
=======
id
expressionId
value
side (indicates if the operand is on the left or right side of the expression)
idx (the index to identify the order of operands on each side)

Operator
========
id
expressionId
type
side
idx

私の見解では、要求に応じてページに動的にコントロールを追加することにより、可変数のオペランドと演算子を使用して式を作成する機能をユーザーに提供したいと思います。ユーザーが[オペランドの追加]ボタンをクリックすると、javascriptを介してオペレーターのドロップダウンが生成され、オペランドのテキストボックスが生成されます。

私の考えは、式の作成アクションでカスタムモデルバインディングを使用し、ビューモデルを操作することです。

public class ExpressionCreateViewModel
{
IEnumerable<ExpressionOperator> Operators { get; set; }
IEnumerable<ExpressionOperand> Operands { get; set; }
Expression Expression { get; set; }
}

モデルバインダーはそれで動作します:

public class ExpressionCreateViewModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var vm = new ExpressionCreateViewModel();
        //Build it!
    }

私が気になっているのは、動的に生成されたコントロールの値をこのビューモデルに渡す方法です。私が考えることができる唯一の方法は、すべての詳細を提供するコントロールIDを作成することです(例:<input type = "text" id = "operand:1 $ side:left">)

次に、フォームコレクション内のアイテムを解析し、慣例により、オペランドオブジェクトと演算子オブジェクトを作成できます。

誰かがこれを行うためのよりクリーンな方法を持っていますか?

ありがとう!

クリス

4

1 に答える 1

0

ビューモデルのコレクションプロパティにバインドする通常の方法は、Html要素の名前付けに配列表記を使用することです。例えば:

<input type="text" id="someId1" name="Operators[0].Type" />
<input type="text" id="someId2" name="Operators[1].Type" />

必要なものによっては、デフォルトのバインダーがこの作業を行う場合もあります。

于 2012-11-24T06:59:50.677 に答える