我昨天花了很多时间搜索和解决这个问题,但没有提出解决方案。这是我用作参考的指南。
问题是表单中的数据没有到达我的控制器。我的目标是获取表单数据并将其传递给我的控制器/模型,以便我可以在整个代码中使用这些值并将它们存储在数据库中。以下是我到目前为止所拥有的...
在我的Browse.cshtml(视图)中
@model Collect
<form asp-action="Collect" asp-controller="Collect" method="post">
<input type="hidden" asp-for="GameId" name="@game.id"/>
<button type="submit" class="dropdown-item btn btn-block">Default</button>
</form>
在我的收集控制器中.cs(控制器)
using System;
using GameLibrary.me.Models;
using Microsoft.AspNetCore.Mvc;
namespace GameLibrary.me.Controllers
{
public class CollectController : Controller
{
[HttpGet]
public IActionResult Collect()
{
return View();
}
[HttpPost, ValidateAntiForgeryToken]
public IActionResult Collect(Collect model)
{
Console.WriteLine("**********n"+model.GameId+"n**********");
return Content($"Hello {model.GameId}");
}
}
}
在我的收藏中.cs(模型)
namespace GameLibrary.me.Models
{
public class Collect
{
public int GameId { get; set; }
}
}
编辑:这是我的IDE告诉我的...
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 POST https://localhost:5001/browse?game=eevee application/x-www-form-urlencoded 7
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 1.0139ms 200
info: Microsoft.AspNetCore.Server.Kestrel[32]
Connection id "0HLJHIUOU6AKO", Request id "0HLJHIUOU6AKO:00000003": the application completed without reading the entire request body.
任何关于我做错了什么的指导将不胜感激......此外,我可以通过隐藏字段类型发送多个值,还是应该为每个值创建一个新的隐藏字段类型?
这里有很多不同的帮助,特别感谢柯克·拉克林!有三个问题阻止我的控制器获取数据。
-
Browse.cshtml 缺少@addTagHelpers...我添加了以下内容:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, AuthoringTagHelpers
-
我的收集控制器.cs缺少路由...我添加了以下内容:
[HttpPost, ValidateAntiForgeryToken] [Route("Index/Collect")]
-
最后,我将与另一种方法冲突的控制器发布方法从"收集"重命名为索引,并更新了我的 Browse.CSHTML 文件中的 asp 操作以匹配。
public IActionResult Index(Collect model)
感谢所有的帮助!
- 特拉维斯·
首先,我将模型传递给初始化 Id 的视图:
public IActionResult Collect()
{
return View(new Collect { GameId = "5"});
}
在视图中将窗体更新为以下内容:
<form asp-action="Collect" asp-controller="Collect" method="post">
@Html.HiddenFor(m => m.GameId)
<button type="submit" class="dropdown-item btn btn-block">Default</button>
</form>
Html 帮助程序将为字段创建编码的 html。单击"提交"后,该值将正确。
就我而言,我用这行代码更新了登录视图。 这是固定的。
<form method="post" asp-controller="account" asp-action="login">
根据您的示例,我不认为您想要自定义操作,您应该能够使用默认框架映射实现您的目标。
public class CollectController : Controller
{
[HttpGet]
public IActionResult Index() => View();
[HttpPost]
public IActionResult Index([FromBody]CollectionModel model) => Content(...);
}
为了澄清魔力,声明的 Post 方法 I 使用 HttpBody
属性,否则框架将期望通过 URL 中的查询字符串定义参数内容。 默认情况下,框架会在命中控制器时查找Index
,如果您不需要 URL 来表示它,则不要使用它。
路由模式通常遵循:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
网址:
http://www.sample.com/Collect ---> 初始索引获取将被命中