Я использую всплывающую форму из этого URL: http://nickstips.wordpress.com/2011/08/11/asp-net-mvc-ajax-dialog-form-using-jquery-ui/. Он загружает диалог jquery внутри div с помощью функции load.
У меня есть форма с несколькими текстовыми полями и 1 полем для загрузки файла. Эта форма работает правильно, и я успешно опубликовал эту форму в действии и восстановил объект HttpPostedFile.
Но когда я загружаю ту же форму в диалоге jquery с помощью функции загрузки и отправляю ту же форму в то же действие, что и раньше, это не удалось. Я не уверен, почему, но объект HttpPostedFile всегда нулевой.
Актуальные коды:
Используя указанный выше DialogForm.js, я вызвал вспомогательную функцию:
@Html.DialogFormButton("Add", Url.Action("Add", "X", new { id = y }), "", "targetId", Url.Action("List", "X", new { id = y }))
Этот код должен загрузить представление в модальном всплывающем окне:
$('.dialogLink').live('click', function () {
var element = $(this);
...
$(dialogDiv).load(this.href, function () {
$(this).dialog({
modal: true,
resizable: false,
title: dialogTitle,
buttons: {
"Save": function () {
// Manually submit the form
var form = $('form', this);
$(form).submit();
},
...
На самом деле я вызываю представление и оно загружает шаблон редактора.
@using (Ajax.BeginForm("Test", "X", new { }, new AjaxOptions { }, new { enctype = "multipart/form-data" }))
{
@Html.EditorFor(m => Model, "editorView")
}
Вид редактора содержит несколько текстовых полей и элемент типа файла ввода:
<tr>
<td class="label">
@Html.LabelFor(m => m.PathToAttachment)
</td>
<td>
<div class="field_container">
@Html.TextBoxFor(m => m.FileUpload, new { type = "file" })
</div>
</td>
</tr>
Все элементы являются членами модельного класса. Который является параметром метода Post Add:
[HttpPost]
public ActionResult AddAttachment(AttachmentModel model) {
if (model.FileUpload.ContentLength > 0) { }
}
Проблема: model.FileUpload всегда имеет значение null, но остальные элементы формы имеют значение. Обратите внимание, что это происходит только когда я использовал DialogForm.js при загрузке формы. В противном случае, когда я загружаю форму на простой странице (не во всплывающем окне), я могу успешно получить значение FileUpload.
Решено, я обнаружил, что невозможно отправить ajax-форму с файлом, поэтому у меня не было выбора, кроме как использовать эту библиотеку:
http://code.google.com/p/ajax-file-upload-struts2/source/browse/trunk/src/main/resources/template/com/davidjc/javascript/ajaxfileupload.js?r=4
Создает невидимый iframe с элементами формы и автоматически отправляет сообщение на сервер.
Спасибо
czetsuya