2012-06-06 41 views
0

我使用mvc3與動態創建的窗體,默認的modelBinder不幫助我。mvc3 - 重寫formcollection鍵

我想獲得與控件值相關聯的表單集合鍵的控件,並將其發回到表單集合中。

controllerContext.HttpContext.Request.Form["IWantToSetThisKeyRightHere"] 

目前這些鍵是自動生成的某個地方,我不明白,支持默認模型綁定,這不適合我反正工作。

如何在創建視圖時設置這些值,以便可以在動態表單發佈時嘗試使用我自己的自定義模型聯編程序來提取數據?

感謝

+1

機會是,如果它的「工作不適合你」,那是因爲你正在做的事情非常錯誤的,然後嘗試做多錯的事情,試圖通過這樣做是錯誤擺在首位,以解決您所產生的問題。順應這個流程要容易得多。因此,也許你能告訴我們你的真正的問題是什麼,而不是你正在試圖解決,因爲你的戰鬥框架副作用。向我們展示您的代碼,視圖和操作方法,然後解釋您要做的事情。 –

+0

@MystereMan感謝您的關注。我通常是發表評論的人。 :-)我以前的帖子可能會清楚我的問題中的力量類型。 [這裏](http://stackoverflow.com/questions/10915314/mvc3-implementing-a-variable-type-recursive-model-with-editors)我的難度似乎從我的模型的動態性質發起與...合作。據我所知,模型綁定器無法處理,它需要一個基本對象或一個非常平坦的集合。我期待着你的見解。 – Todd

+0

如果您還是想更精確的例子(有代碼)讓我知道,我會給一個在一起。 – Todd

回答

0

根據你前面的問題,您的問題似乎並沒有是複雜的。你讓它比它要困難得多。所有你需要的是一個簡單的模型,看起來像這樣:

public class Container { 
    public List<Container> Containers {get;set;} 
    public Question Question {get;set;} 
} 

public class Question { 
    public List<Answer> Answers {get;set;} 
} 

只是猜測這裏的答案很可能不能包含任何東西,因此它需要自己的對象和問題,只能包含答案。如果問題可以包含其他問題或容器,那麼您可以稍微修改一下以完成該工作。

這些都不需要特殊的模型活頁夾。

您不需要從單個基地繼承所有對象,也不需要使用奇怪的模板選擇器。

你做這樣的事情做到這一點:

EditorTemplates/Container.cshtml

@model Container 

@Html.EditorFor(m => m.Containers) 
@Html.EditorFor(m => m.Question) 

EditorTemplates/Question.cshtml

@model Question 

@Html.EditorFor(m => m.Answers) 

EditorTemplates/Answer.cshtml

@model Answer 

// whatever your answer code is.. if you have multiple answer types then you 
// need a template for each type 

默認的MVC模板系統將爲您處理所有這些,並且模型會爲您綁定所有內容。在將它傳遞給視圖之前,您只需正確地實例化模型。

+0

我真的* *欣賞設計解決方案,以和諧與底層系統的總體思路,但對於我的系統是動態的要求是不是我可以改變,只是MVC3不能與現成的處理。涉及衆多類型特定列表的解決方案不是動態的,會丟失信息。例如:子問題是在子容器之前或之後執行的。不過,我感謝您花時間回覆。我已經解決了我試圖解決的問題,並將在下面發佈答案(有更多空間的地方)。祝你有美好的一天。 – Todd

+0

@Todd - 那麼我想我不明白你的問題,因爲你在其他提到的問題是我的回答解決。你之前和之後提出的問題是模板的實現細節,並且處理起來微不足道。你所描述的問題根本不是一個難題,並且在MVC的開箱即用功能之內。 –

0

表單集合的關鍵來自input元素的name屬性。 我試圖通過使用一個html助手並傳入新的名稱屬性值來覆蓋該值。

像這樣:

@{ var uniqueNameAttribute = new { name = Model.UniqueName };} 
@Html.TextBox(Model.MessageText, Model.Answer, uniqueNameAttribute) 

我試圖設置(Model.UniqueName)這個名字值被認爲大概是通過MVC設計了一個字符串,使其能夠值回映射到相同的覆蓋modelBinding在post之後的模型類。

由於我的系統是動態的,因此mvc無法將數據映射回模型。我想控制這個值,使我能夠在後期將數據映射回手動

解決方案非常簡單,我只需要做的就是而不是使用@ Html.TextBox助手來生成文本框,並使用我想要的名稱屬性自己創建它。

<input type="text" class="vmFreeTextAnswer" name="@Model.UniqueName" value="" /> 

這允許我勾貼值回我的動態結構上崗位模型。