ASP.NET Core 2.1 Razor表单,发布未到达控制器

时间:2019-01-03 16:14:51

标签: c# razor asp.net-core .net-core asp.net-core-mvc

昨天我花了大量时间搜索并解决此问题,但没有提出解决方案。 Here is the guide I used as reference.

问题在于表单中的数据未到达我的控制器。我的目标是获取表格数据并将其传递给控制器​​/模型,以便我可以在整个代码中使用这些值并将其存储在数据库中。以下是我到目前为止所拥有的...

在我的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>

在我的CollectController.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}");
    }    
  }
}

在我的Collect.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.

任何关于我做错事情的指导都将受到赞赏...另外,我可以通过隐藏字段类型发送多个值,还是应该为每个值创建一个新的隐藏字段类型?

4 个答案:

答案 0 :(得分:2)

这里有很多不同的帮助,特别是感谢Kirk Larklin!有三个问题阻止我的控制器获取数据。

  1. Browse.cshtml缺少@addTagHelpers ...我添加了以下内容:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @addTagHelper *, AuthoringTagHelpers
    
  2. 我的CollectController.cs缺少路由...我添加了以下内容:

    [HttpPost, ValidateAntiForgeryToken]
    [Route("Index/Collect")] 
    
  3. 最后,我将控制器发布方法从“收集”重命名,该方法与另一种方法冲突到索引并更新了Browse.CSHTML文件中的asp-action以匹配。

    public IActionResult Index(Collect model)
    

感谢所有帮助!

-特拉维斯W

答案 1 :(得分:0)

根据您的示例,我认为您不需要自定义操作,因此应该能够使用默认框架映射实现目标。

public class CollectController : Controller
{
     [HttpGet]
     public IActionResult Index() => View();

     [HttpPost]
     public IActionResult Index([FromBody]CollectionModel model) => Content(...);
}

为弄清魔术,声明的Post方法我使用了HttpBody属性,否则框架将期望通过URL中的查询字符串定义参数内容。默认情况下,该框架会在命中Controller时查找Index,如果不需要表示该URL的URL,则不要使用它。

路由模式通常如下:

routes.MapRoute(
                "Default",                         // Route name
                "{controller}/{action}/{id}",      // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

URL:

http://www.sample.com/Collect --->初始索引Get将被命中

答案 2 :(得分:0)

首先,我将模型初始化为带有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编码。单击提交后,该值将是正确的。

答案 3 :(得分:0)

就我而言,我用这行代码更新了登录视图。这是固定的。

<form method="post" asp-controller="account" asp-action="login">