2009-09-17 43 views
1

在这种情况下,用户不安装Javascript,为了画一个表格,我开始是这样的:ASP.NET MVC Ajax窗体:enctype是否正确?为什么没有文件上传?

<% using (Html.BeginForm("Create", "Language", FormMethod.Post, 
    new {enctype="multipart/form-data"})) 
{ %> 

如果用户已经安装Javascript,下面的代码被用于:

<% using (Ajax.BeginForm("Create", "Language", 
    new AjaxOptions { UpdateTargetId = "CommonArea" }, 
    new { enctype = "multipart/form-data" })) 
{ %> 

问题是这样的:

在第一种情况下,我可以使用下面的指令在业务层中获取上传的文件:

// Get the uploaded file 
HttpPostedFile Flag = HttpContext.Current.Request.Files["Flag"]; 

在第二种情况下,该指令不起作用。我如何知道使用Ajax.BeginForm上传该文件?代码是否正确?任何人有更多的经验建议使用jQuery插件上传表单之前上传文件?

谢谢

回答

3

你不能单独使用AJAX做文件上传。许多(大多数?)异步上传器使用动态创建的隐藏iframe,其中包含一个通常回传给服务器的表单。我建议通过jQuery插件存储库查找“ajax upload”并查看是否可以找到适用于您的插件,该插件将使用javascript和iframe的组合进行上载。

注意:此时Firefox和Chrome支持XMLHttpRequest2,它允许通过AJAX请求上传。人们会期望对此的支持将在某些时候变得普遍,并且在所有浏览器中都可以实现真正的异步上传。支持FormData的浏览器也可以使用该界面上传文件。

+0

哎呀...感谢您指出了这一点...浪费了2个小时搜索的问题... – 2012-04-25 11:58:48

1

jQuery Form插件有一个非常非常整洁和完全透明的方式做到这一点。它会自动转换为隐藏的iframe。只有你需要做的是在表单上调用.ajaxForm()来初始化组件。唯一的问题是,如果您从action方法返回json,则必须更改内容类型,以便您的回调函数将其识别为json。

这是一个有点怪异,但是这是为我工作:

JsonResult result = Json(response); 
result.ContentType = "text/html"; 
return result;