0

我正在使用 SWFUpload 上传文件。为了获取我需要与文件一起传递的数据,我将 post 参数添加到 swfupload。问题是我写的自定义模型绑定器在swfupload调用控制器方法时没有被调用。我的模型的某些属性已设置,但我的自定义绑定器控制的属性未设置,这意味着它使用的是默认模型绑定器。

当我使用以下 JQuery 方法时,一切都按预期工作。所以问题不在于我的自定义模型绑定器设置不正确。

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

以下是我用来设置帖子参数并开始上传过程的代码。请注意,我知道 setPostParams 函数,但由于某种原因它对我不起作用,因此可以解决。另请注意,我验证了在服务器端的 Request 变量中正确设置了 post 参数。

$('#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;
}

为什么没有调用自定义模型绑定器的任何想法?

4

1 回答 1

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

Type%5B0%5D 被解码为 Type[0]。MVC 将其识别为字典,然后我们就开始比赛了。

将已编码的字符串传递给 SWFUpload addPostParam 函数是问题所在。它采用我设置的值,即“Type%5B0%5D”并将“%”编码为 %25。所以来自 SWFUpload 的查询字符串是:

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

然后类型被解码为 Type%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);
}

非常感谢 Matthew Abbott 对我的帖子发表了评论,这让我重新审视了传递给服务器的名称。你救了我的理智。

于 2010-07-01T19:55:41.363 回答