Всем привет. есть следующий метод
[HttpPost]
public ActionResult AttachFile(int operationId)
{
var _operation = _operationService.GetOperationById(operationId);
foreach (string file in Request.Files)
{
var upload = Request.Files[file];
if (upload != null)
{
var attachedFile = new AttachedFile()
{
OriginalName = upload.FileName,
NewName = upload.FileName,
RootDirectory = _operation.GetDirectory(),
Stream = upload.InputStream
};
_fileWorking.SaveFile(attachedFile);
}
}
return RedirectToAction("Index", new { operationId = operationId });
}
Данный метод используется в следующем представлении:
@model IEnumerable
@Html.Partial("_AttachmentFilesList", Model)
Код скрипта:
$(document).ready(function () { $('#submit').on("click", function (e) { e.preventDefault(); var files = document.getElementById('uploadFile').files; if (files.length > 0) { if (window.FormData !== undefined) { var data = new FormData(); for (var x = 0; x < files.length; x++) { data.append("file" + x, files[x]); }
$.ajax({ type: "POST", url: "/Attachment/AttachFile?operationId=" + $('#submit').attr('data-operationId'), contentType: false, processData: false, data: data, success: function () { $("#ActionLink").click(); }, error: function () { $("#ActionLink").click(); } }); } else { alert("Браузер не поддерживает загрузку файлов HTML5!"); } } }); });
При запуске приложения на локальной машине все работает.файлы сохраняются. После публикации приложения на сервер метод не срабатывает. Запустил отладку в браузере и вижу следующую ошибку:
"NetworkError: 404 Not Found - http://10.5.0.253/Attachment/AttachFile?operationId=154"
Не пойму, почему так?
Ответ
Нет, так, как вы предложили в комментарии, делать не нужно.
Проблема в виртуальном пути. Но просто захардкодить другой путь - неправильно! Ведь приложение может быть установлено по любому пути.
Для правильного получения виртуального пути к действию следует воспользоваться хелпером Url
url: "@Url.Action("AttachFile", "Attachment")?operationId=" + $('#submit').attr('data-operationId')
Способ выше подойдет, если ваш скрипт находится в .cshtml-файле. Но есть лучший способ, к тому же работающий всегда. Можно передать нужный путь через атрибут любого из элементов. В вашем случае красивее всего будет передать url там же, где сейчас передается operationId
url: this.dataset.url,
Комментариев нет:
Отправить комментарий