отправка динамического c списка объектов из представления в контроллер - PullRequest
1 голос
/ 25 февраля 2020

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

Сначала я поместил два углубления в представление и предоставил кнопки добавления и удаления, чтобы позволить пользователям добавлять больше углублений. Это выглядит так: enter image description here Я использую это javascript, чтобы добавить больше ям:

        var maxPits = 10;
    var minPits = 2;
    var wrapper = $(".pits");
    var addButton = $(".addPit");
    var delButton = $(".delPit");
    var x = 2;
    $(addButton).click(function (e) {
        e.preventDefault();
        if (x < maxPits) {
            x++;
            $(wrapper).append('<div class="row pit' + x + '"><div class="col-sm-1">Pit ' + x + '</div><div class="col-sm-3"><input type="number" placeholder="1.234" name="pit' + x + 'day1" id="pit' + x + 'day1"></div><div class="col-sm-3"><input type="number" placeholder="1.234" name="pit' + x + 'day2" id="pit' + x + 'day2"></div><div class="col-sm-3"><input type="number" placeholder="1.234" name="pit' + x + 'day3" id="pit' + x + 'day3"></div></div>');
            updatePitCount();
        } else {
            alert('too many pits!');
        }
    });

    $(delButton).click(function (e) {
        e.preventDefault();
        if (x > minPits) {
            var lastPit = '.pit' + x;
            $("div").remove(lastPit);
            x--;
            updatePitCount();
        } else {
            alert('must have a minimum of two!');
        }
    });

Моя модель выглядит так:

    public class ResultsModel
{
    public List<Pit> Pits { get; set; }
}

public class Pit
{
    public int Id { get; set; }
    public double Day1 { get; set; }
    public double Day2 { get; set; }
    public double Day3 { get; set; }
    public double Mean
    {
        get
        {
            var x = 0;
            var total = 0.0;

            if (Day1 > 0.0) { x += 1; total += Day1; }
            if (Day2 > 0.0) { x += 1; total += Day2; }
            if (Day3 > 0.0) { x += 1; total += Day3; }

            if(x>0) return (total) / x;
            return 0.0;
        }
    }
}

My частичное представление выглядит следующим образом:

    <div class="container pits">
    <div class="row">
        <div class="col-sm-1 btn-group">
            <button class="btn btn-sm btn-success glyphicon glyphicon-plus addPit"></button>
            <button class="btn btn-sm btn-danger glyphicon glyphicon-minus delPit"></button>
        </div>
        <div class="col-sm-3">
            TEST 1
        </div>
        <div class="col-sm-3">
            TEST 2
        </div>
        <div class="col-sm-3">
            TEST 3
        </div>
    </div>
    <div class="row">
        <div class="col-sm-1">
            Pit 1
        </div>
        <div class="col-sm-3">
            <input type="number" placeholder="1.234" name="pit1day1" />
        </div>
        <div class="col-sm-3">
            <input type="number" placeholder="1.234" name="pit1day2" />
        </div>
        <div class="col-sm-3">
            <input type="number" placeholder="1.234" name="pit1day3" />
        </div>
    </div>
    <div class="row">
        <div class="col-sm-1">
            Pit 2
        </div>
        <div class="col-sm-3">
            <input type="number" placeholder="1.234" name="pit2day1">
        </div>
        <div class="col-sm-3">
            <input type="number" placeholder="1.234" name="pit2day2">
        </div>
        <div class="col-sm-3">
            <input type="number" placeholder="1.234" name="pit2day3">
        </div>
    </div>
</div>

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

Я хочу что-то подобное в контроллере:

            foreach (var pit in model.Pits)
        {
            var x1 = pit.Day1;
            var x2 = pit.Day2;
            var x3 = pit.Day3;
            var m = pit.Mean;
            //do something...
        }

Как я могу получить данные Dynami c из посмотреть на контроллер через модель?

Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

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

Пример:

Если вы передаете модель

public class ResultsModel
{
    public List<Pit> Pits { get; set; }
}

в просмотрите и получите то же самое, тогда ваш формат имени атрибута должен выглядеть как Pits[0].Day1.

, поэтому ваш html как

<input type="number" placeholder="1.234" name="Pits[0].Day1" />
<input type="number" placeholder="1.234" name="Pits[1].Day1" />

, так что один.

И еще одна вещь используйте for l oop вместо foreach, если вы используете бритву для создания списка элементов.

Если вы передаете

List<Pit>

в представление и получаете то же самое, тогда Ваш атрибут имени должен иметь формат [0].Day1.

0 голосов
/ 25 февраля 2020

Вы должны опубликовать данные для действия через тег формы!

<form method="post" action="/Pit/Create">
   <div class="row">
    <div class="col-sm-1">
        Pit 1
    </div>
    <div class="col-sm-3">
        <input type="number" placeholder="1.234" name="[0].Day1" />
    </div>
    <div class="col-sm-3">
        <input type="number" placeholder="1.234" name="[0].Day2" />
    </div>
    <div class="col-sm-3">
        <input type="number" placeholder="1.234" name="[0].Day3" />
    </div>
</div>
<div class="row">
    <div class="col-sm-1">
        Pit 2
    </div>
    <div class="col-sm-3">
        <input type="number" placeholder="1.234" name="[1].Day1">
    </div>
    <div class="col-sm-3">
        <input type="number" placeholder="1.234" name="[1].Day2">
    </div>
    <div class="col-sm-3">
        <input type="number" placeholder="1.234" name="[1].Day3">
    </div>
</div>
</form>
...