我希望将算术表达式存储到数据库中。我有这个数据库结构:
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为操作员生成一个下拉列表,并为操作数生成一个文本框。
我的想法是在我的表达式的Create操作中使用自定义模型绑定并使用viewmodel:
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(例如&lt; input type =“text”id =“operand:1 $ side:left”&gt;)
然后我可以解析表单集合中的项目,按照惯例构建操作数和操作符对象。
有没有人有更清洁的方法来做这件事?
谢谢!
克里斯
答案 0 :(得分:0)
在视图模型中绑定到集合属性的常规方法是在命名Html元素时使用数组表示法。例如:
<input type="text" id="someId1" name="Operators[0].Type" />
<input type="text" id="someId2" name="Operators[1].Type" />
根据您的需要,默认的活页夹甚至可以帮您完成这项工作。