Коллекция Request.Files пуста при переходе от jQuery к коду ASP.NET - PullRequest
1 голос
/ 11 февраля 2009

Я использую ASP.NET MVC Beta. У меня есть вызов AJAX, выполняющийся через jQuery, который захватывает значения моей формы и отправляет их в действие контроллера. Если я запускаю этот вызов без 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 Ответ

1 голос
/ 11 февраля 2009

Да, это имеет смысл, сериализация jquery не собирается обрабатывать данные загрузки файла. Вы захотите взглянуть на какой-нибудь плагин для обработки загрузки файла. Я сделал поиск в Google и нашел только плагины, которые позволяли стилизовать кнопку обзора. вам, возможно, придется пройти через фреймы iframe или silverlight.

Обновление Как отмечено в комментарии, это плагин jQuery Form , который поддерживает загрузку файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...