загрузка файла mvc3 с помощью формы ajax - Request.Files пусто - PullRequest
2 голосов
/ 14 декабря 2011

Я использую mvc3 и пытаюсь создать серию форм ajax, каждая из которых загружает файл на одной странице.Вот представление для страницы:

@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>

    @Html.Partial("_UploadItem")
    @Html.Partial("_UploadItem")
    @Html.Partial("_UploadItem")

<script type="text/javascript">
    function Go() {
        // loop through form tags
        for (var n = 0; n < document.forms.length; n++) {
            var f = document.forms[n];
            // if a dress is chosen, a caption is chosen
            // and a file is chosen, then submit the ajax form
            if (f.dressid.value != '' &&
               f.dresscaption.value != '' &&
               f.fileitem.value != '')
                f.submit();
        }
    }
</script>
<input type="button" onclick="Go();"/>

Затем функция Go () перебирает формы ajax, проверяя, не являются ли все 3 элемента (dressid, dresscaption и fileitem) в каждой форме непустымии вызывает отправляет формы, которые делают, начиная асинхронную загрузку.

Вот частичное представление:

@using SoRefeising.Models
@using (Ajax.BeginForm("UploadFile", new { }, new AjaxOptions { HttpMethod = "POST" }, new { enctype="multipart/form-data"}))
{
    List<SelectListItem> items = (List<SelectListItem>)ViewBag.Dresses;

    <span>Dress</span>
    @Html.DropDownList("dressid", items, "Choose Dress");
    <span>Caption</span>
    @Html.TextBox("dresscaption")
    <input type="file" id="fileitem" />    
}

Я пометил каждую форму с атрибутом multipart.Когда страница генерируется, я получаю следующее:

<form action="/upload/UploadFile" data-ajax="true" data-ajax-method="POST" enctype="multipart/form-data" id="form0" method="post">    <span>Dress</span>
<select id="dressid" name="dressid"><option value="">Choose Dress</option>
<option value="1">Simpson01</option>
<option value="2">Simpson02</option>
</select>    <span>Caption</span>
<input id="dresscaption" name="dresscaption" type="text" value="" />    <input type="file" id="fileitem" />    
</form>

    <form action="/upload/UploadFile" data-ajax="true" data-ajax-method="POST" enctype="multipart/form-data" id="form1" method="post">    <span>Dress</span>
<select id="dressid" name="dressid"><option value="">Choose Dress</option>
<option value="1">Simpson01</option>
<option value="2">Simpson02</option>
</select>    <span>Caption</span>
<input id="dresscaption" name="dresscaption" type="text" value="" />    <input type="file" id="fileitem" />    
</form>

    <form action="/upload/UploadFile" data-ajax="true" data-ajax-method="POST" enctype="multipart/form-data" id="form2" method="post">    <span>Dress</span>
<select id="dressid" name="dressid"><option value="">Choose Dress</option>
<option value="1">Simpson01</option>
<option value="2">Simpson02</option>
</select>    <span>Caption</span>
<input id="dresscaption" name="dresscaption" type="text" value="" />    <input type="file" id="fileitem" />    
</form>

Все выглядит хорошо ...

Вот действие контроллера, которое называется

[HttpPost]
        public ActionResult UploadFile(string dressid, string dresscaption)
        {
                HttpPostedFileBase hpf = Request.Files[0] as HttpPostedFileBase;
...

Когдавызывается действие, коллекция Request.Files содержит 0 элементов, а не выбранный файл.Я включил ненавязчивый javascript, ненавязчивый файл загружается на главной странице и работает на других страницах.

Я видел несколько сообщений на форуме о том, как быть осторожным с размерами файлов.Файл, с которым я тестирую, <2k </p>

Есть идеи, почему в Request.Files нет элементов?

Спасибо

Ответы [ 2 ]

9 голосов
/ 14 декабря 2011

Вы не можете загружать файлы, используя AJAX.Поэтому замените Ajax.BeginForm нормальным Html.BeginForm.Вы также можете оформить следующую запись в блоге .

Если вы хотите использовать асинхронную загрузку, вы можете попробовать некоторые из доступных компонентов загрузки, такие как Ajax Upload и Uploadify .

0 голосов
/ 14 декабря 2011

Прежде всего, я не уверен, почему у вас есть это три раза.

@Html.Partial("_UploadItem")
@Html.Partial("_UploadItem")
@Html.Partial("_UploadItem")

Вы пытаетесь загрузить несколько файлов? Существует довольно много сценариев, которые позволяют сделать это достаточно эффективно. Вы также создаете несколько форм с полями, которые содержат один и тот же идентификатор. Это не повлияет на процесс загрузки, но это плохая практика. Я думаю, что вам нужно рефакторинг выше. В любом случае измените поле в вашем частичном представлении на

<input type="file" name="file" />

Я думаю, что проблема может быть в ваших реальных действиях и в том, как вы пытаетесь получить файл. Попробуйте это

HttpPostedFileBase postedFile = Request.Files["file"];

Дайте мне знать, если это работает.

...