web-dev-qa-db-ja.com

ASP.NET Core 2.1 Razorフォーム、Postがコントローラーに到達しない

昨日、解決策を考え出すことなく、この問題を検索して対処するのに十分な時間を費やしました。 これは私が参照として使用したガイドです

問題は、フォームからのデータがコントローラーに到達しないことです。私の目標は、フォームデータを取得してそれをコントローラー/モデルに渡し、コード全体で値を使用してデータベースに格納できるようにすることです。以下はこれまでのところです...

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.

私が間違っていることについてのガイダンスをいただければ幸いです...また、非表示フィールドタイプを介して複数の値を送信できますか、または各値に対して新しい非表示フィールドタイプを作成する必要がありますか?

6
iamtravisw

最初に、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を作成します。 [送信]をクリックすると、値が正しくなります。

1
eVolve

カスタムアクションが必要だとは思わない例に基づいて、デフォルトのフレームワークマッピングで目標を達成できるはずです。

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

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

マジックを明確にするために、宣言されたPostメソッドはHttpBody属性を使用します。それ以外の場合、フレームワークはパラメーターの内容がURLのクエリ文字列を介して定義されることを期待します。フレームワークはデフォルトで、コントローラーがヒットしたときにIndexを検索します。それを表すために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がヒットします

0
Greg