从 jQuery 传递到 ASP.NET 代码时,Request.Files 集合为空

Posted

技术标签:

【中文标题】从 jQuery 传递到 ASP.NET 代码时,Request.Files 集合为空【英文标题】:Request.Files Collection empty when passing from jQuery to ASP.NET code 【发布时间】:2010-10-07 00:02:28 【问题描述】:

我正在运行 ASP.NET MVC Beta。我有一个通过 jQuery 运行的 AJAX 调用,它获取我的表单值并将它们发布到控制器操作。如果我在没有 AJAX 的情况下在正常形式的发布场景中运行此调用,那么一切都会正确进行。但是,一旦我合并了 jQuery 代码,除了文件之外的所有表单值都会通过。 Request.Files() 什么也不返回。我在这里还缺少其他部分吗?

html 代码:

<form action="/Images/AddImages/" enctype="multipart/form-data" id="frmAddImages" method="post">
    <%=Html.Hidden("hfPromoId",ViewData.Model.Promotion.PromoId) %>
    <table>
        <tr>
            <td>Images for Promo: </td>
            <td><span class="promoTitle"><%=Html.Encode(ViewData.Model.Promotion.PromoName) %></span></td>
        </tr>
        <tr class="newImageContainer">
            <td>Select Image:</td>
            <td>
                <input type="file" id="txtImagePath" name="txtImagePath" />
            </td>
        </tr>
        <tr class="newImageContainer">
            <td>Image Caption:</td>
            <td>
                <input id="txtImageCaption" name="txtImageCaption" />
            </td>
        </tr>
        <tr>
            <td><input type="submit" value="Save Image" id="AddImages" /></td>     
        </tr>
    </table> 
</form> 

控制器代码:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddImages(bool? partial)

    int promoId = Convert.ToInt32(Request.Form["hfPromoId"]);
    var promo = _promoRepository.GetPromotion(promoId);

    string imageCaption = Request.Form["txtImageCaption"].ToString();
    string imagePath = string.Empty;

    foreach (string file in Request.Files)
    
        HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;

        if (hpf.ContentLength == 0)
         continue; 

        imagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"Content\PromoImages",
                                            promo.PromoId.ToString() + "__" + Guid.NewGuid().ToString() + Path.GetFileName(hpf.FileName));
        hpf.SaveAs(imagePath);
    

    _promoRepository.SaveImageForPromo(promoId, imageCaption, imagePath, this.Request);

    if (partial == true)
    
        return List(true, promoId);
    

    return View("Images", GetModel(promoId));

jQuery 代码:

$(document).ready(function() 
        $('#frmAddImages').submit(function() 
            runAjax(form, updateImageList, 'html');
            return false;
        );
);


function runAjax(form, callback, format) 
    $.ajax(
        url: form.action + '?partial=true',
        type: form.method,
        dataType: format,
        data: $(form).serialize(),
        success: callback
    );


function updateImageList(result) 
    $('#gallery').html(result);
    setElementStyling();

【问题讨论】:

【参考方案1】:

是的,这是有道理的,jquery serialize 不会处理文件上传数据。您将需要查看某种插件来处理文件上传。我做了一些谷歌搜索,只找到了允许浏览按钮样式的插件。您可能必须采用 iframe 或 silverlight 路线。

更新 如评论中所述,它们是支持文件上传的jQuery Form plugin。

【讨论】:

其中一些东西对我来说还是新的。我使用 jQuery Form 插件来实现我需要的结果。谢谢!

以上是关于从 jQuery 传递到 ASP.NET 代码时,Request.Files 集合为空的主要内容,如果未能解决你的问题,请参考以下文章

将数据传递到处理程序的 Jquery ajax 不起作用(Asp.net、C#、Jquery)

将 jquery json 传递到 asp.net httphandler

如何将数据从 jquery 代码传递到我的项目后端

如何将 Dictionary<string, string> 变量从后面的代码传递到 asp.net?

无法使用 Jquery 将数据从视图发送到控制器 Asp.net MVC

将 html 标记从 jquery 发布调用发送到 asp.net 页面时,从客户端检测到潜在危险的 Request.QueryString 值