Всем привет. есть следующий метод
[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,
Комментариев нет:
Отправить комментарий