Razor 如何发送参数并将文件上载到一个操作

Razor 如何发送参数并将文件上载到一个操作,razor,asp.net-core-mvc,Razor,Asp.net Core Mvc,答复: 问题似乎在于形式的定义。我将其改为action,并将值改为/MyController/ActionName/parameter1/parameter2/parameter3,而不是asp操作,这就成功了。如果有人能解释为什么这是有效的,即使VS说这条路径没有找到,我希望得到一个答案。多谢各位 我正在尝试上载一个文件,并向ASP.NET核心控制器中的某个操作发送一些参数。但是,表单提交按钮一直将我重定向到索引操作,而不是我指定的内容。我试过用谷歌搜索,但没有找到答案 注意:我使用Razor

答复: 问题似乎在于形式的定义。我将其改为action,并将值改为/MyController/ActionName/parameter1/parameter2/parameter3,而不是asp操作,这就成功了。如果有人能解释为什么这是有效的,即使VS说这条路径没有找到,我希望得到一个答案。多谢各位

我正在尝试上载一个文件,并向ASP.NET核心控制器中的某个操作发送一些参数。但是,表单提交按钮一直将我重定向到索引操作,而不是我指定的内容。我试过用谷歌搜索,但没有找到答案

注意:我使用Razor视图

我的控制器这是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>
指定路由参数时,它们必须用花括号括起来,即[route[controller]/[action]/{cardNumber}/{sectionId}/{file}],而不是[route[controller]/[action]/cardNumber/sectionId/file]

只能将原语int、string等用作路由参数。换句话说,{file}将不起作用,因为它是ifformfile类型,并且无法将其绑定到路由中

路由是您操作的URL。因此,必须指定所有路由参数才能生成URL。那不是你在这里做的。您需要一个简单的静态URL,然后将数据发布到该URL。换句话说,将其更改为[Route[controller]/[action]]。您正在发布的数据来自请求的POST正文,并将绑定到操作方法的相应参数

虽然不是问题。就其本身而言,指定路由和HTTP谓词属性(如HttpPost)是多余的。只要做:

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

您显示的代码不会将您重定向到索引操作,因此您未显示的代码不会导致问题。检查是否没有嵌套表单添加整个Index.cshtml。不确定还有什么要添加的。为什么有带参数的[Route]属性您没有生成路由值-您正在发布一个表单-该表单应该被删除,但我如何访问参数?因为您在方法的签名中有参数,它们将从表单值绑定