Как отправить параметры и загрузить файл за одно действие - PullRequest
0 голосов
/ 08 октября 2018

Ответ: Кажется, проблема в определении формы.вместо asp-action я изменил его на action и изменил значение на / MyController / ActionName / параметр1 / параметр2 / параметр3, и это помогло.Если бы кто-нибудь мог объяснить, почему это работает (хотя VS говорит, что этот путь не найден), я бы с удовольствием ответил.Спасибо.

Я пытаюсь загрузить файл и отправить несколько параметров для действия в моем ASP.NET Core Controller.Однако кнопка отправки формы продолжает перенаправлять меня на действие Index, а не на то, что я указываю.Я попытался погуглить это и не нашел ответа.

Примечание: я использую Razor Views

Мой контроллер (это HomeController):

    public ActionResult Index()
    {
        return View();
    }

    [Route("[controller]/[action]/cardNumber/sectionId/file")]
    [HttpPost]
    public ActionResult GenerateSingleCardData(string cardNumber, int sectionId, IFormFile file)
    {
    .... UNREACHABLE CODE
    }

Фрагментмое представление (это частичное представление SingleCardForm):

<form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="GenerateSingleCardData">
Select file : <input type="file" name="file" required/> <br/>
Card Number: <input type="text" name="cardNumber" required/> <br/>
SectionID: <input type="number" name="sectionId" required/> <br/>
<input type="submit" value="Start"/>

РЕДАКТИРОВАТЬ: Полный просмотр:

<!DOCTYPE html>

<html>
<head>
    <script src="/JQuery/jquery-3.3.1.min.js"></script>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>


<input type="radio" name="ActionType" checked="checked" onclick="ShowSingleCardForm()"> Single Card <br/>
<input type="radio" name="ActionType" onclick="ShowAllCardsForm()"> All Section Cards <br/>

<div id="Form">
    @await Html.PartialAsync("SingleCardForm")
</div>

</body>
</html>

<script>
    function ShowSingleCardForm() {
        var url = '@Url.Action("GetSingleCardForm", "Home")';
        LoadForm(url);
    }

    function ShowAllCardsForm() {
        var url = '@Url.Action("GetAllCardsForm", "Home")';
        LoadForm(url);
    }

    function LoadForm(url) {
        var formDiv = document.getElementById("Form");

        while (formDiv.firstChild) {
            formDiv.removeChild(formDiv.firstChild);
        }

        $('#Form').load(url);
    }
</script>

1 Ответ

0 голосов
/ 08 октября 2018
  1. При указании параметров маршрута они должны быть заключены в фигурные скобки, т.е. [Route("[controller]/[action]/{cardNumber}/{sectionId}/{file}")], а не [Route("[controller]/[action]/cardNumber/sectionId/file")].

  2. Вы можете использовать только примитивы (int, string и т. д.) в качестве параметров маршрута.Другими словами, {file} не будет работать, поскольку он имеет тип IFormFile, и его невозможно связать с маршрутом.

  3. Маршрут - это URL-адрес вашего действия.В результате все параметры маршрута должны быть указаны для генерации URL.Это не то, что вы делаете здесь.Вам нужен простой статический URL, на который вы затем отправляете данные.Другими словами, измените его на [Route("[controller]/[action]")].Публикуемые вами данные поступают из тела запроса POST и будут привязаны к соответствующим параметрам вашего метода действия.

  4. Пока это не проблема.По сути, излишне указывать Route и атрибут глагола HTTP, например HttpPost.Просто сделайте:

    [HttpPost("[controller]/[action]")]
    
...