与动态表单控件的模型绑定

时间:2012-11-23 18:43:34

标签: asp.net-mvc asp.net-mvc-3 model-view-controller

我希望将算术表达式存储到数据库中。我有这个数据库结构:

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;)

然后我可以解析表单集合中的项目,按照惯例构建操作数和操作符对象。

有没有人有更清洁的方法来做这件事?

谢谢!

克里斯

1 个答案:

答案 0 :(得分:0)

在视图模型中绑定到集合属性的常规方法是在命名Html元素时使用数组表示法。例如:

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

根据您的需要,默认的活页夹甚至可以帮您完成这项工作。