web-dev-qa-db-fra.com

ASP.NET Core 2.1 Razor Form, Post n'atteignant pas le contrôleur

Hier, j'ai passé une bonne partie de mon temps à chercher et à résoudre ce problème sans trouver de solution. Voici le guide que j'ai utilisé comme référence.

Le problème est que les données du formulaire n'atteignent pas mon contrôleur. Mon objectif est de prendre les données du formulaire et de les transmettre à mon contrôleur/modèle afin que je puisse utiliser les valeurs dans tout mon code et les stocker dans la base de données. Voici ce que j'ai jusqu'à présent ...

Dans mon Browse.cshtml (Afficher)

@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>

Dans mon CollectController.cs (contrôleur)

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}");
    }    
  }
}

Dans mon Collect.cs (modèle)

namespace GameLibrary.me.Models

{
public class Collect
{
    public int GameId { get; set; }
  }
}

EDIT: Voici ce que mon IDE me dit ...

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.

Tout conseil sur ce que je fais mal serait très apprécié ... Puis-je également envoyer plusieurs valeurs via le type de champ masqué, ou dois-je créer un nouveau type de champ masqué pour chaque valeur?

6
iamtravisw

Je passerais d'abord le modèle à la vue avec l'ID initialisé:

    public IActionResult Collect()
    {

        return View(new Collect { GameId = "5"});
    }

Dans votre vue, mettez à jour le formulaire comme suit:

<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>

L'assistant HTML créera le code HTML codé pour le champ. Une fois que vous avez cliqué sur soumettre, la valeur sera correcte.

1
eVolve

Sur la base de votre exemple, je ne pense pas que vous souhaitiez des actions personnalisées, vous devriez être en mesure d'atteindre votre objectif avec le mappage du cadre par défaut.

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

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

Pour clarifier la magie, la méthode Post déclarée utilise un attribut HttpBody, sinon le framework s'attend à ce que le contenu du paramètre soit défini via la chaîne de requête dans l'URL. Par défaut, le framework recherche Index lorsqu'un contrôleur a été atteint, si vous n'avez pas besoin de l'URL pour le représenter, ne l'utilisez pas.

Le modèle de routage suit généralement:

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 ---> L'index initial Get serait frappé

0
Greg