2012-06-08 46 views
2

我使用MVC和AJAX.BeginForm來做一些Ajax更新我的頁面。該BeginForm代碼看起來是這樣的:如何使用MVC傳遞動態值AJAX.BeginForm

using (Ajax.BeginForm("HandleCrop", "Card", 
        new 
        { 
         accept = true, 
         id = Model.ImageUpload.ID, 
         file = Model.ImageUpload.File, 
         imageCropX = Model.CropInfo.X, 
         imageCropY = Model.CropInfo.Y, 
         imageCropWidth = Model.CropInfo.Width, 
         imageCropHeight = Model.CropInfo.Height       
        }, 
        new AjaxOptions 
        { 
         HttpMethod = "POST", 
         OnComplete = "ConfirmCompleted", 
         OnSuccess = "ReloadUpload", 
         OnFailure = "Failure" 
        }, null)) 

正在落實的Model.CropInfo作爲隱藏字段,像這樣:

<%=Html.HiddenFor(m => m.CropInfo.X) %> 
<%=Html.HiddenFor(m => m.CropInfo.Y) %> 
<%=Html.HiddenFor(m => m.CropInfo.Width) %> 
<%=Html.HiddenFor(m => m.CropInfo.Height) %> 

但是,這些值被動態地一些客戶端的JavaScript修改,這些值需要通過Ajax回調到服務器。上面的代碼顯然不起作用,因爲Ajax表單中的imageCrop參數在頁面呈現時被填充(因此全部爲0)。

我的問題是:處理這種情況的正確方法是什麼?

回答

1

從阿賈克斯這部分應絕對刪除:

imageCropX = Model.CropInfo.X, 
    imageCropY = Model.CropInfo.Y, 
    imageCropWidth = Model.CropInfo.Width, 
    imageCropHeight = Model.CropInfo.Height 

隨着TryUpdateModelActionCropInfo應填寫從發佈的數據確定。

如果您不使用模型的自動更新(或通過TryUpdateModel) 的,而是你是使用這個數據作爲輸入參數Action然後就這些Action參數重命名爲CropInfo_XCropInfo_YCropInfo_WidthCropInfo_Height(我認爲這是隱藏字段將如何在HTML中命名,請在頁面源中查看)

+0

我沒有使用模型的自動更新。我按照你所描述的刪除了這些參數,隱藏的字段確實被稱爲你描述的方式(用_)。但是我仍然不明白這些值如何在'HandleCrop'函數中結束。向HandleCrop添加Model參數不起作用,因爲這只是一個未初始化的對象。你能否詳細說明如何正確地做到這一點? – Arthur

+0

他們將最終行動起來,因爲當Ajax發出post請求時,會發現並序列化表單中的所有輸入,隱藏,選擇和其他字段。您只需確保Action中的參數名稱與HTML中的字段名稱相匹配。這種行爲已經實現併發生在幕後。 – Dusan

+0

我已經看到你的隱藏字段的名稱將包含。 (點),這對於這種情況並不好,因爲C#不允許在標識符中使用點。如果先前討論過的方法不起作用,請將您的Html.HiddenFor替換爲 Dusan