2010-06-29 50 views
0

我使用SWFUpload上傳文件。爲了獲得我需要的文件傳遞數據,我添加了後綴參數到swfupload。問題是,當swfupload調用控制器方法時,我寫的自定義模型聯編程序不會被調用。我的模型的一些屬性被設置,但不是由我的自定義綁定器控制的屬性,這意味着它使用默認的模型綁定器。使用SWFUpload時未調用.NET MVC 2.0自定義模型Binder

當我使用下面的JQuery方法時,一切都按預期工作。所以問題不在於我的自定義模型聯編程序設置不正確。

$.post('AsyncUpload', $('#uploadform').serialize()); 

以下是我用來設置後續參數並開始上傳過程的代碼。請注意,我知道setPostParams函數,但由於某種原因,它不適合我,因此需要解決此問題。另外請注意,我驗證了在服務器端的Request變量中正確設置了後參數。

$('#uploadbutton').click(function (e) { 
    e.preventDefault(); 
    var data = $('#uploadform').serialize(); 
    var res = $.parseQuery(data); 

    for (key in res) { 
      swfu.addPostParam(key, res[key]); 
    } 

    swfu.startUpload(); 
}); 

相關的swfupload變量設置如下。

upload_url: '<%= Url.Action("AsyncUpload")%>', //This becomes /Home/AsyncUpload 
use_query_string: true, // I have also tried setting this to false to no effect 

這是我的控制器方法,比如它。

[HttpPost] 
public bool AsyncUpload(EditModel model) 
{ 
    if (Request.Files.Count <= 0) 
     return false; 

    return true; 
} 

任何想法爲什麼不調用自定義模型聯編程序?

+0

我能想到的唯一的事情就是你有一些表單名稱不匹配(在發佈數據中的鍵名),這與你的EditModel類型的屬性不匹配。您是否已驗證所有表單名稱/發佈數據鍵與您模型的屬性相同? – 2010-06-30 12:51:00

+0

我已經證實他們是正確的,我認爲他們是,但我很微妙地錯誤。我會用我發現的答案回答,但謝謝你推動我朝着正確的方向前進。我一直在努力爭取一段時間。 – 2010-07-01 19:21:55

回答

0

事實證明,問題的原因是字符編碼。我的自定義模型聯編程序被構建來處理字典屬性。

我的模型看起來有點像這樣:

public class EditModel 
{ 
    public string Name { get; set; } 
    public Dictionary<int, string> Type { get; set; } 
} 

正如我的問題說,在控制器方法如下所示:

[HttpPost] 
public bool AsyncUpload(EditModel model) 
{ 
    if (Request.Files.Count <= 0) 
     return false; 

    return true; 
} 

在客戶端我有文本框控件和複選框。文本框被映射到字符串屬性。複選框將被映射到字典屬性,並且將具有類似於「Type [0]」,「Type [7]」等的名稱,我使用自定義模型聯編程序解析以從括號中提取密鑰。

現在,一切都調用jQuery函數

$.get('AsyncUpload', $('#uploadform').serialize()); 

時,由於發送到控制器的查詢字符串是

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%5B0%5D 

類型%5B0%5D被解碼爲類型按預期工作[0] 。 MVC認識到,作爲一本字典,我們是爲了比賽。

將已編碼的字符串傳遞給SWFUpload addPostParam函數是個問題。它取的是我設定的值,即'鍵入%5B0%5D'並將'%'編碼爲%25。所以從SWFUpload的查詢字符串爲:然後

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%255B0%255D 

類型被解碼爲類型%5B0%5D是無法識別的,通過MVC的字典。名稱將被正確設置,因爲默認模型聯編程序知道如何處理簡單的字符串屬性。

要解決這個問題,我對我的javascript進行了以下更改。它將用實際的括號來代替括號編碼。然後,他們將被重新編碼回服務器,並且與宇宙一切都會很好。

for (key in res) { 
    var value = res[key]; 
    var fixedKey = key; 
    fixedKey = fixedKey.replace('%5B', '['); 
    fixedKey = fixedKey.replace('%5D', ']'); 
    swfu.addPostParam(fixedKey, value); 
} 

非常感謝馬修雅培誰在我的崗位,這引起了我有被傳遞到服務器再看看名字評論。你救了我的理智。

相關問題