Публикация данных из представления в контроллер с флажком - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть следующий класс:

public class Entidade
{
    public string Voz { get; set; }
    public bool Valor { get; set; }
}

Я генерирую представление (GET) с контроллером:

public IActionResult Entidade()
    {
        var model = GetVoidEntidade.Entidades();

        return View(model);
    }

Где GetVoidEntidade.Entidades () будет генерировать список "Энтидада »с 5 строками, в каждой из которых есть« Энтидада »с уникальной строкой для« Воз »и« Валь », будет ложным.

Вид:

<form asp-action="Entidade">
        @{ 
             int i = 0;
         }

         @foreach (var entidade in Model)
         {
             var name = $"Valor[{i++}]";
             <input type="checkbox" value="@entidade.Valor" class="form-check-input" name=@name />@entidade.Voz<br />
         }

        <div class="form-group">
             <input type="submit" value="Próximo" class="btn btn-success align-content-end float-md-right" />
        </div>
 </form>

ПОЧТАконтроллер только для того, чтобы я мог, через отладчик выбрать возврат:

[HttpPost]
public IActionResult Entidade([FromBody]IEnumerable<Entidade> model)
{
    var boh = Request.Form.Files;

     return View();
 }

Когда я запускаю его и пытаюсь выполнить POST, я получаю сообщение об ошибке 405: Метод не разрешен и достаточно уверен, не получайте данные.

Как я могу получить данные из флажка в контроллер?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

[FromBody] означает, что вы отправляете что-то вроде application/json или application/xml.Форма HTML отправляется как x-www-form-urlencoded или multipart/form-data.Удалите атрибут [FromBody] из параметра действия.Это решает вашу непосредственную проблему, но после этого вы просто получите пустую модель, потому что ваши входные имена неверны.

Во-первых, вам нужно использовать for вместо foreach,так как вам нужно проиндексировать список.Во-вторых, имя, которое вы генерируете в настоящее время, даже удаленно неверно.Это должно быть что-то вроде: [N].Valor, где N - индекс.В-третьих, вы должны просто использовать помощник по тегам, чтобы вам даже не приходилось об этом думать.Другими словами, ваш код должен быть:

<form asp-action="Entidade">
    @for (var i = 0; i < Model.Count; i++)
    {
        <input asp-for="@Model[i].Valor" type="checkbox" class="form-check-input" />
        @entidade.Voz<br />
    }

    <div class="form-group">
        <button type="submit" class="btn btn-success align-content-end float-md-right">Próximo</button>
    </div>
</form>
0 голосов
/ 27 сентября 2019

элемент name должен быть одинаковым для всех элементов в одной группе

@foreach (var entidade in Model)
 {
     //var name = $"Valor[{i++}]";
     <input type="checkbox" value="@entidade.Valor" class="form-check-input" name="StaticName" />@entidade.Voz<br />
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...