2012-08-12 57 views
1

操作方法使用ASP.NET MVC 3和剃刀,我對MyViewModel類一個強類型的視圖。在視圖中,我有一個由一組單選按鈕組成的AJAX表單。在它下面,我有一個正常的HTML表單,用於收集MyViewModel的數據。根據在AJAX表單中選擇哪個單選按鈕,我想用一組默認值或其他值更新HTML表單。在AJAX表單中,我試圖發佈兩條數據:1)代表所選選項的值(基於單選按鈕value參數);以及2)從視圖中選擇Model。我希望控制器操作根據收到的選項更新模型,然後以更新後的模型對象作爲參數返回一個局部視圖。我該怎麼做呢?下面是AJAX的形式爲我嘗試代碼:MVC 3員額模型和附加參數HttpPost使用Ajax形式

@using (Ajax.BeginForm("MyAction", "MyController", 
     new AjaxOptions { 
      HttpMethod = "POST", 
      InsertionMode = InsertionMode.Replace, 
      UpdateTargetId = "createForm" 
     })) 
{ 
    <div id="formOptions"> 
     @foreach (Option op in Model.GetOptions()) { 
      <div class="editor-field"> 
      @Html.RadioButton("option", op.OptionType, false, new { @id = op.ID, @name = op.ID, @title = @op.Description, @onfocus = "javascript:$(this).closest('form').find(':submit').first().click()" }) 
      <label for="@op.ID">@op.Name</label> 
      </div> 
     } 
    </div> 
    @Html.Hidden("model", Model) 
    <input type="submit" value="Select" style="display:none;" /> 
} 

我的問題是,在HttPost操作方法model參數爲null。但option參數似乎正確傳遞。我不確定我是否以不應該使用Html.Hidden輸入的方式使用它,或者是什麼問題。如果需要,我可以發佈更多代碼。

這是我在做這樣的事情的第一次嘗試,所以讀了很多的(貌似)的類似問題後,我仍然無法破譯什麼我想要做的解決方案。我看到很多不同的東西,比如JSON編碼,使用JQuery等,但我不確定是否需要這些東西,或者如果我可以使用MVC功能來完成此操作(我寧願不重新編碼已經存在的東西內置於MVC 3)。如果有人能指出我正確的方向或可能給一個小代碼示例,它將不勝感激。而且,考慮到我的最終目標是什麼,如果有更好的方法來異步更新基於選項控件的表單,我會非常樂意聽到它。謝謝!

編輯:

我也注意到,使用HttpPost請求它不會使控制器,而是一個HTTPGET一樣。那裏有人嗎?這讓我瘋狂!

ADDED控制器的方法:

public PartialViewResult CreateForm(OptionType opType, MyViewModel model) { 
    model.ApplyOptionValues(opType); 
    return PartialView("_CreateForm", model); 
} 
+0

你可以添加你想要發佈到取悅方法簽名? – timothyclifford 2012-08-13 07:09:15

回答

0

我不會整個模型回發到您正試圖與@Html.Hidden("model", Model)做的只是把您與名稱的形式所需要的具體項目/匹配類型控制器你的控制器。您可以使用選定的單選按鈕的值以及隱藏的輸入值將標識信息傳遞給控制器​​,並在那裏執行您需要的任何邏輯。這就是說,我認爲今後最好的解決方案是使用像JQuery這樣的JavaScript框架來處理所有的AJAX請求。 Asp.net MVC使得使用內置塊進行簡單操作變得非常簡單,但是一旦你需要執行更復雜的操作,它肯定會失敗。如果你只使用了正確的工具(JQuery),你最終會在限制範圍內付出更多的努力。

請確保您的註釋POST操作方法與[HttpPost]從GET方法來區分。

也可以使用詳細的Web調試器來檢查發送到應用程序的確切內容。我喜歡非常受歡迎的Fiddler。 http://www.fiddler2.com/fiddler2/

+0

感謝JQuery的建議。我在別處讀過類似的評論,所以我可以走這條路。 – neizan 2012-08-13 07:40:53

0

我同意Mattbo:將整個模型放在一個圓圈中是不必要的開銷。你不會說你爲什麼,但我懷疑這是因爲你可以比較「舊」和「新」價值。鑑於該控制器模型起源,可以包括對模型(例如GUID)在視圖模型的唯一標識符,把在一個隱藏字段中的POST數據包括,然後在遣返後的「新」的數據將是自動映射到強類型的ViewModel。然後,您可以重新獲取原始模型,並根據需要隨意使用它們。

處理AJAX表單是一個單獨的問題/表單,然後:您的單選按鈕在(視圖模型)表單中填寫默認值(包括隱藏字段以記錄選定的廣播),用戶填充將其他數據和整個(非ajax)表單發佈到MyController.MyAction方法,並且默認活頁夾將自動將表單值映射到MyViewModel(如果它們遵循正確的命名約定)。所以AJAX與實際發佈的表單無關。另外,你也可以像Mattbo所說的那樣用AJAX來做所有事情。

(旁白)原諒我,如果你已經知道,但你可以用剃刀HTML輔助來創建領域,如:

@Html.EditorForModel() 
@Html.EditorFor(model => model.[field name]) 

在控制器,你會創建一個類似的行動: 公衆的ActionResult MyAction() { MyViewModel }

[HttpPost] 
public ActionResult MyAction(MyViewModel myModel) 
+0

關於發佈整個模型,原因是該模型包含一些不受所選選項影響的屬性。因此,如果用戶爲那些未受影響的字段輸入了數據,然後選擇了不同的選項,則刷新的表單(使用全新的模型)將替換應該獨立於使用默認值選擇的選項的數據,並且用戶必須重新輸入該數據。那有意義嗎? – neizan 2012-08-13 09:03:36