Formularz o nieokreślonej liczbie pól

0

Cześć,
Chcę napisać aplikację webową, która będzie pobierać od użytkownika zestawienie faktur -> przerabiać je do innego formatu (XML) i udostępniać użytkownikowi.

Koncepcja jest taka: użytkownik wskazuje na stronie plik -> program go odczytuje -> udostępnia plik do pobrania w XML -> dodatkowo wyświetla na stronie formularz z listą znalezionych faktur -> użytkownik może ręcznie zmodyfikować część danych (np. kwotę, numer etc.) -> po modyfikacji danych ma możliwość z updet'owania danych w pliku XML (uwzględniając naniesione dane) -> a więc trzeba ponownie wysłać formularz z danymi, ale już nie z pliku, tylko te wyświetlone na ekranie, które użytkownik ręcznie zmodyfikował...

Załóżmy, że mam prostą klasę Faktura, która ma dwa pola:

class Faktura {
public string Numer
public decimal Kwota; }

A moje pytanie brzmi: czy w takiej sytuacji akcja controllera po wysłaniu formularza ([HttpPost]) może przyjmować List<Faktura> fakutry, które będą ponownie wracać do tej samej akcji i wyświetlane w formularzu z możliwością edycji?

Jeśli tak to jak w widoku powinienem odwoływać się do poszczególnych faktur znalezionych w pliku? Jak nazywać poszczególne pola formularza? Czy mogę jakoś stosować index-y?
Chodzi mi o to, żeby po wysłaniu formularza zostało rozpoznane, że została wysłana lista obiektów Faktura.

Jak jest jeden obiekt to jest to proste, bo wtedy binding sam sobie przypisuje do obiektu dane, które się tak samo nazywają (jak poniżej):

<form action="/Home/FormTest" method="post">
        <label for="numer">Numer:</label>
        <input type="text" name="Numer" value="@Model.Numer" />
        <label for="kwota">Kwota:</label>
        <input type="number" name="Kwota" value="@Model.Kwota" />

        <button type="submit">Update</button>
    </form>

A jak ma wyglądać formularz, który składa się z danych dotyczących wielu obiektów Faktura i który ma być przekazany do metody przyjmującej jako argument List<Faktura>?

Z góry dziękuję za pomoc.

1

Znam takie sposoby:

1: Przyjmujesz dwie listy

public IActionResult Test(List<string> Numery, List<int> Kwoty)
<input name="Numery[]" value="" />
<input name="Kwoty[]" value="" />

Nie trzeba pilnować indexów, ale można.

A później sam to mapujesz na Faktura

2: Jako złożony obiekt

public IActionResult Test(List<Faktura> input)
<input name="input[0].Numer" value="27" />
<input name="input[0].Kwota" value="8" />

<input name="input[1].Numer" value="1" />
<input name="input[1].Kwota" value="3" />

Ale musisz pilnować indexów, bo bez tego nie przejdzie. Nie może być np 0 i 2 zamiast 0 i 1.

0

Dzięki.
Okazało się, że w widoku mogę również odwoływać się do listy tzn. w kontrolerze dać argument List<Faktura> fv a w widoku odwoływać się przez fv[i].kwota/numer etc. Czyli można to jeszcze bardziej uprościć :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1