使用SWFUpload时未调用.NET MVC 2.0自定义模型Binder

问题描述:

我使用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

事实证明,问题的原因是字符编码。我的自定义模型联编程序被构建来处理字典属性。

我的模型看起来有点像这样:

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); 
} 

非常感谢马修雅培谁在我的岗位,这引起了我有被传递到服务器再看看名字评论。你救了我的理智。