ASP.NET Core 2.1 Razor Form, сообщение не достигает контроллера - PullRequest
0 голосов
/ 03 января 2019

Я потратил много времени на поиск и проработку этой проблемы вчера, не придумав решения. Вот руководство, которое я использовал для справки.

Проблема в том, что данные из формы не доходят до моего контроллера. Моя цель - взять данные формы и передать их моему контроллеру / модели, чтобы я мог использовать значения в своем коде и сохранять их в базе данных. Ниже то, что я имею до сих пор ...

В моем Browse.cshtml (View)

@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 (Controller)

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.

Буду признателен за любые указания относительно того, что я делаю неправильно ... Также я могу отправить несколько значений через скрытый тип поля или мне нужно создать новый тип скрытого поля для каждого значения?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Здесь было много различной помощи, особенно благодаря Кирку Ларклину!Было три проблемы, которые мешали моему контроллеру собирать данные.

  1. В файле Browse.cshtml отсутствовал @addTagHelpers ... Я добавил следующее:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @addTagHelper *, AuthoringTagHelpers
    
  2. В моем CollectController.cs отсутствовал маршрут ... Я добавил следующее:

    [HttpPost, ValidateAntiForgeryToken]
    [Route("Index/Collect")] 
    
  3. Наконец, я переименовал метод поста контроллера в 'Collect'который конфликтует с другим методом для индексации и обновил asp-действие в моем файле Browse.CSHTML для соответствия.

    public IActionResult Index(Collect model)
    

Спасибо за помощь!

-Travis W

0 голосов
/ 03 января 2019

Сначала я передам модель представлению с инициализированным идентификатором:

    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-код для поля.После того как вы нажмете «Отправить», значение будет правильным.

0 голосов
/ 03 января 2019

Исходя из вашего примера, я не верю, что вам нужны настраиваемые действия, вы сможете достичь своей цели с помощью сопоставления фреймворка по умолчанию.

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

URL:

http://www.sample.com/Collect ---> Начальный индекс Get будет достигнут

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...