如何发送参数并将文件上传到一个动作

时间:2018-10-08 11:16:04

标签: razor asp.net-core-mvc

答案: 问题似乎出在表格的定义上。而不是asp-action,我将其更改为action,然后将值更改为/ MyController / ActionName / parameter1 / parameter2 / parameter3,从而达到了目的。如果有人可以解释为什么这样做有效(即使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 :(得分:1)

  1. 在指定路由参数时,它们必须用大括号括起来,即[Route("[controller]/[action]/{cardNumber}/{sectionId}/{file}")],而不是[Route("[controller]/[action]/cardNumber/sectionId/file")]

  2. 您只能将基元(int,字符串等)用作路由参数。换句话说,{file}不起作用,因为它的类型为IFormFile,并且无法将其绑定到路由中。

  3. 路线是您操作的网址。结果,必须指定所有路由参数才能生成URL。那不是你在这里做什么。您需要一个简单的静态URL,然后将数据发布到该URL。换句话说,将其更改为[Route("[controller]/[action]")]。您要发布的数据来自请求的POST正文,并将绑定到您的action方法的各个参数中。

  4. 虽然没有问题。从本质上讲,同时指定Route和HTTP动词属性(如HttpPost)是多余的。只要做:

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