【问题标题】:Model binding with dynamic form controls具有动态表单控件的模型绑定
【发布时间】:2012-11-23 18:43:34
【问题描述】:

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

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(例如

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

有人有更清洁的方法吗?

谢谢!

克里斯

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 有趣,你知道我在哪里可以找到一个例子吗?谷歌没有返回任何相关内容。谢谢!
    • 认为这会有所帮助:hanselman.com/blog/…
    • 犯罪!当我生成我的控件时,我只需要遵循现有的约定。很棒的东西,非常感谢您的提示,我对这种架构更满意。
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多