2012-11-23 55 views
0

我正在尋找將數學表達式存儲到數據庫。我有這樣的分貝結構:動態表單控件的模型綁定

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(例如<輸入類型=「text」id =「operand:1 $ side:left」>)

然後我可以通過表單集合中的項目和通過約定構建操作數和操作符對象。

有沒有人有更乾淨的方式來做到這一點?

謝謝!

克里斯

回答

0

綁定到集合屬性在視圖模型的正常方式是使用數組表示法中的HTML元素的命名。例如:

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

根據您的需要,默認活頁夾甚至可以爲您完成這項工作。

+0

有趣的,你會碰巧知道我能找到一個例子嗎? Google沒有返回任何相關內容。謝謝! –

+0

認爲這將有助於:http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx –

+0

有罪!當我生成我的控件時,我只需要遵循現有的約定。神奇的東西,非常感謝你的建議,我對這個建築更加開心。 –