Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

ASP.NET MVC method NotFound

Всем привет. есть следующий метод
[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 @{ ViewBag.Title = "Index"; if (Request.IsAjaxRequest()) { Layout = null; } }

@Ajax.ActionLink("Update", "Index", "Attachment", new { operationId = ViewBag.OperationId }, new AjaxOptions { UpdateTargetId = "tabAttachment" }, new { @id = "ActionLink", @role = "presentation", @style = "visibility:hidden;" })
@Html.Partial("_AttachmentFilesList", Model)
@Scripts.Render("~/bundles/attachment")
Код скрипта:
$(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,

Комментариев нет:

Отправить комментарий