答案:
问题似乎出在表格的定义上。而不是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>
答案 0 :(得分:1)
在指定路由参数时,它们必须用大括号括起来,即[Route("[controller]/[action]/{cardNumber}/{sectionId}/{file}")]
,而不是[Route("[controller]/[action]/cardNumber/sectionId/file")]
。
您只能将基元(int,字符串等)用作路由参数。换句话说,{file}
不起作用,因为它的类型为IFormFile
,并且无法将其绑定到路由中。
路线是您操作的网址。结果,必须指定所有路由参数才能生成URL。那不是你在这里做什么。您需要一个简单的静态URL,然后将数据发布到该URL。换句话说,将其更改为[Route("[controller]/[action]")]
。您要发布的数据来自请求的POST正文,并将绑定到您的action方法的各个参数中。
虽然没有问题。从本质上讲,同时指定Route
和HTTP动词属性(如HttpPost
)是多余的。只要做:
[HttpPost("[controller]/[action]")]