Как я могу вернуть список объектов из FormCollection? - PullRequest
0 голосов
/ 13 января 2019

Я использую форму с циклом for, в зависимости от количества полей ввода формы. Я хочу вернуть список Formcollection. Я знаю, что formcollection возвращает только одну форму, но я хочу вернуть много форм (список) Так что мой метод контроллера работает только с 1 формой Мой контроллер:

  [HttpPost]
    public ActionResult SecondStepProcessValid(FormCollection form)
    {
        List<Customer> itemList = new List<Customer>();
        int i = 0;

          itemList.Add(new Customer()
            {

                Name = form["Name"],
                Emailaddress = form["Email"],
                HouseNumber = Int32.Parse(form["HouseNumber"]),
                Zipcode = form["Zipcode"]

          });
        foreach (var c in itemList)
        {
            customerRepository.Create(c);
        }
        return View("ThirdStepProcess");

}    

мой взгляд

<form method="post" action="@Url.Action("SecondStepProcessValid")">
        @for (int i = 0; i < Model.Amount; i++)
        {

            <div class="space">
                <div><br /></div>
                <div>Guest@(@i + 1)</div>
            </div>

            <div class="space">
                <div>Name</div>
                <div>@Html.TextBox("Name", Model.NewCustomers[i].Name)</div>
            </div>

            <div class="space">
                <div>Email</div>
                <div>@Html.TextBox("Email", Model.NewCustomers[i].Emailaddress)</div>
            </div>

            <div class="space">
                <div>House Number</div>
                <div>@Html.TextBox("HouseNumber", Model.NewCustomers[i].HouseNumber)</div>
            </div>

            <div class="space">
                <div>Zipcode</div>
                <div>@Html.TextBox("Zipcode", Model.NewCustomers[i].Zipcode)</div>
            </div>
            <input type="hidden" name="Index" value="@i" />

        }
        <input type="submit" value="Step 3" />
    </form>

1 Ответ

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

Вы не можете размещать несколько форм вместе. Но вы также можете разместить несколько элементов в форме или несколько List<T>.

Для этого вам нужно сделать ваш вид строго типизированным, а затем в действии вы можете иметь параметр типа List<Customer> или модель контейнерного представления со свойством типа List<Customer>, которое будет выглядеть следующим образом:

public class CustomersModel 
{
    public int Amount { get; set; }

    public List<Customer> NewCustomers{ get; set; }

    CustomersModel()
    {
        Amount = new List<Customer>();
    }
}

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

    @model YourNamespace.Models.CustomersModel

    @for (int i = 0; i < Model.Amount; i++)
    {

        <div class="space">
            <div><br /></div>
            <div>Gast @(@i + 1)</div>
        </div>

        <div class="space">
            <div>Name</div>
            <div>@Html.TextBoxFor(x => Model.NewCustomers[i].Name)</div>
        </div>

        <div class="space">
            <div>Email</div>
            <div>@Html.TextBoxFor(x =>  Model.NewCustomers[i].Emailaddress)</div>
        </div>

        <div class="space">
            <div>House Number</div>
            <div>@Html.TextBoxFor(x => Model.NewCustomers[i].HouseNumber)</div>
        </div>

        <div class="space">
            <div>Zipcode</div>
            <div>@Html.TextBox(For(x => Model.NewCustomers[i].Zipcode)</div>
        </div>
            @Html.HiddenFor(x=> Model.NewCustomers[i].Id,i)

    }

теперь в контроллере вы можете иметь строго типизированный параметр:

[HttpPost]
public ActionResult SecondStepProcessValid(CustomersModel model)
{
    foreach (var c in model.NewCustomers)
    {
        customerRepository.Create(c);
    }
    return View("ThirdStepProcess");
}

Надеюсь, что это дает идею.

...