Как передать List через viewmodel с cs html без базы данных - PullRequest
0 голосов
/ 01 мая 2020

Я работаю над веб-приложением, где вы можете хранить то, что у вас есть в вашем магазине. Но когда я нажимаю «отправить», предыдущий список не отображается в отправленной форме.

Все остальное в информации находится в модели представления.

Любая помощь приветствуется

Вот мой код

INDEX.CS HTML

@{
ViewData["Title"] = "Home Page";
}

@model WebApp.Models.Item;

<div class="text-center">
    <h1 class="display-4">Stock manager</h1>
    <form asp-controller="Home" asp-action="AddItem" method="post">
        <label>Naam</label>
        <input type="text" asp-for="Name" name="Name" />
        <label>Aantal</label>
        <input type="number" asp-for="Aantal" name="Aantal" />
        <label>Beschrijving</label>
        <input type="text" asp-for="Beschrijving" name="Beschrijving" />
        <input type="submit" value="toevoegen" />

        <h1 class="display-4">Stock list</h1>
        @if (Model.Stock != null)
        {
    <ul>
        @for (int idx = 0; idx < Model.Stock.Count; idx++)
        {
            <li>
                @Html.HiddenFor(Model.Stock[idx].Name)
                @Html.HiddenFor(Model.Stock[idx].Aantal)
                @Html.HiddenFor(Model.Stock[idx].Beschrijving)
                <h3>@Model.Stock[idx].Name</h3>
                <p>Aantal: @Model.Stock[idx].Aantal</p>
                <p>Beschrijving: @Model.Stock[idx].Beschrijving</p>
            </li>

        }
    </ul>
        }
        else
        {
            <span>Nog niets toegevoegd</span>
        }
    </form>
</div>

HOMECONTROLLER.CS

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using WebApp.Models;

namespace WebApp.Controllers
{
public class HomeController : Controller
{

    private readonly ILogger<HomeController> _logger;
    public  List<Item> items;
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;

    }

    public IActionResult Index()
    {
        Item item = new Item();
        return View(item);
    }


    public IActionResult AddItem(Item item)
    {
        if (item.Stock == null)
        {
            item.Stock = new List<Item>();
        }

        item.Stock.Add(new Item
        {
            Name = item.Name,
            Aantal = item.Aantal,
            Beschrijving = item.Beschrijving
        });

        return View("Index",item);
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}
}

ITEM.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApp.Models
{
public class Item
{
    public string Name { get; set; }
    public int Aantal { get; set; }
    public string Beschrijving { get; set; }
    public List<Item> Stock { get; set; }
}
}

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

Спасибо!

RAW HTML после добавления 2 предметов

 <div class="text-center">
    <h1 class="display-4">Stock manager</h1>
    <form method="post" action="/Home/AddItem">
        <label>Naam</label>
        <input type="text" name="Name" id="Name" value="test" />
        <label>Aantal</label>
        <input type="number" name="Aantal" data-val="true" data-val-required="The Aantal field is required." id="Aantal" value="3" />
        <label>Beschrijving</label>
        <input type="text" name="Beschrijving" id="Beschrijving" value="test" />
        <input type="submit" value="toevoegen" />

        <h1 class="display-4">Stock list</h1>
            <ul>
                    <li>
                        <h3>test</h3>
                        <p>Aantal: 3</p>
                        <p>Beschrijving: test</p>
                    </li>
            </ul>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8KvM1zMUD4ZOqfaYG4a2bsBumYriiijPssoEk30unaH30LZcWhGlluH47isCWUR2P-tDvQNQWZgxgHJRhqHf_2SyfcRI80clCL3fvM0hETtZ43eiWokSS3vId3OQe-P8rP1jBe5RWYyt8n9UB9yPjaI" /></form>
</div>

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Когда вы вызываете index, вы создаете новый объект Item, поэтому вы не видите свой предыдущий добавленный элемент. Измените его на что-то вроде:

public Item item; 

public IActionResult Index()
    {
        if(item == null)
       {
         Item item = new Item();
         return View(item);
       }
       return View(item);
    }
0 голосов
/ 01 мая 2020

Вам нужно использовать a для l oop, а не foreach, и индексировать элементы списка следующим образом ...

<ul>
@for (int idx = 0; idx < Model.Stock.Count; idx++) {
    <li>
                @Html.HiddenFor(model => Model.Stock[idx].Name)
                @Html.HiddenFor(model => Model.Stock[idx].Aantal)
                @Html.HiddenFor(model => Model.Stock[idx].Beschrijving)
                <h3>Model.Stock[idx].Name</h3>
                <p>Aantal: Model.Stock[idx].Aantal</p>
                <p>Beschrijving: Model.Stock[idx].Beschrijving</p>
    </li>

}
</ul>
...