Модель Asp .Net Core теряет значения после многократной отправки формы - PullRequest
0 голосов
/ 13 июня 2019

Вот моя проблема, у меня есть простая форма, которая делится на шаги.

  • Пользователь вводит свой номер
  • Опубликовать, чтобы проверить базу данных на предмет пользовательских данных и вернуть доступные Celulas для этого пользователя
  • Верните Celulas и добавьте их в список выбора, чтобы пользователь мог выбрать один
  • После того, как пользователь выберет один, отправьте сообщение снова, чтобы получить референции на эту Celula
  • Возвратите ссылки и добавьте в список выбора
  • Пользователь выбирает referencia
  • Нажмите кнопку "Отправить", чтобы опубликовать всю модель

Вот вопросы.

Когда я публикую первый раз, публикуется свойство CodigoOperador. Когда я публикую второй раз, Celula имеет значение, но значение CodigoOperador теряется Когда я публикую третий раз, значение Referencia не публикуется и все равно null

Я использую ненавязчивый ajax для этого, как вы можете видеть в методах формы.

Я пытался до нескольких форм для каждого ввода, но потом я не мог опубликовать всю модель в конце, и это был огромный беспорядок.

Итак, мой вопрос: как лучше всего решить эту проблему?

Предполагаемый результат - это, как правило, проводка каждого ввода по одному и в конце подтверждения публикации всей модели со всеми значениями.

Вот код

модель просмотра

public class OperadorLoginViewModel
{
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Operador" ,Prompt = "Operador")]
    public int? CodigoOperador { get; set; }

    [Required]
    [Display(Name = "Célula", Prompt = "Célula")]
    public int? Celula { get; set; }

    [Required]
    [Display(Name = "Referência", Prompt = "Referência")]
    public int? Referencia { get; set; }
}

HTML

 <form method="post"
                          data-ajax="true"
                          data-ajax-method="post"
                          data-ajax-begin="onBegin" data-ajax-complete="onComplete"
                          data-ajax-failure="onFailed" data-ajax-success="onSuccess">

                        <div class="row">
                            <div class="col-md-12">

                                <div class="form-group">

                                    <input asp-for="Operador.CodigoOperador" class="form-control custom-input" />
                                    <span asp-validation-for="Operador.CodigoOperador" class="text-danger"></span>

                                </div>

                                <div class="form-group d-none">

                                    <select asp-for="Operador.Celula" class="form-control custom-input">
                                        <option value="">Selecione uma Célula</option>
                                    </select>
                                    <span asp-validation-for="Operador.Celula" class="text-danger"></span>


                                </div>

                                <div class="form-group d-none">



                                    <select asp-for="Operador.Referencia" class="form-control custom-input">
                                        <option value="">Selecione uma Referência</option>
                                    </select>
                                    <span asp-validation-for="Operador.Referencia" class="text-danger"></span>


                                </div>

                            </div>
                        </div>

                        <div class="row">
                            <div class="col-6">

                                <button type="submit" class="btn btn-dark rounded login-button d-none" style="width:100%">
                                    <i class="fa fa-check"></i>
                                    Entrar
                                </button>

                            </div>
                            <div class="col-6">

                                <button type="button" class="btn btn-dark rounded cancel-button d-none" style="width:100%">
                                    <i class="fa fa-eraser"></i>
                                    Reset
                                </button>

                            </div>
                        </div>
                    </form>

эта форма отправляется в эту функцию несколько раз

        public async Task<IActionResult> OnPostAsync()
        {
            if (Operador.Celula == null)
            {
                IDbConnection con = new SqlConnection(_config.GetConnectionString("ListaGeralConnection"));

                var query = @"SELECT 
                            Sector AS UAP, 
                            CASE
                                WHEN Turno = 1 THEN 'Manhã'
                                WHEN Turno = 2 THEN 'Tarde'
                                WHEN Turno = 3 THEN 'Noite'
                            END Turno
                          FROM 
                            empregados 
                          WHERE Numero = @CodigoOperador 
                          AND Estado = 'Ativo'";

                var operador = await con.QueryFirstOrDefaultAsync<OperadorViewModel>(query, new { CodigoOperador = Operador.CodigoOperador });

                //var uap = "UAP2";

                if (operador.UAP != null)
                {
                    var celulas = await _context.Celulas.Where(c => c.UAP == operador.UAP).ToListAsync();

                    if (celulas != null)
                    {
                        return new JsonResult(new { celulas = celulas });
                    }

                    return new JsonResult("Não existem células atríbuidas a este UAP.");
                }

                return new JsonResult("Este operador não existe.");
            }
            else if (Operador.Referencia == null)
            {
                var referencias = await _context.Referencias
                   .Where(r => r.Matrizes.Any(c => c.CelulaId == Operador.Celula))
                   .Select(x => new Referencia
                   {
                       Id = x.Id,
                       Nome = x.Nome
                   })
                   .ToListAsync();

                if (referencias != null)
                {
                    return new JsonResult(new { referencias = referencias });
                }

                return new JsonResult("Não existem referências nesta célula.");
            }
            else
            {
                var data = DateTime.Now.ToString("dd-MM-yyyy");

                return new JsonResult(1);
            }
        }

вот логика JavaScript для формы

    var onSuccess = function (response) {

        if (response.celulas) {
            GetCelulas(response.celulas);
        }
        if (response.referencias) {
            GetReferencias(response.referencias);
        }   
    };

  function GetCelulas(celulas) {

        var $select = $('#Operador_Celula');

        $.each(celulas, function (i, celula) {

            var option = $('<option>', {
                value: celula.id
            }).html(celula.nome).appendTo($select);

        });

        $('#Operador_CodigoOperador').prop('disabled', true);
        $('#Operador_Celula').parent().removeClass('d-none');
    }

    function GetReferencias(referencias) {

        if (referencias.length > 1) {

            var $select = $('#Operador_Referencia');

            $.each(referencias, function (i, referencia) {
                //console.log(celula);
                var option = $('<option>', {
                    value: referencia.id
                }).html(referencia.nome).appendTo($select);
                //console.log(option);
            });

            $('#Operador_Celula').prop('disabled', true);
            $('#Operador_Referencia').parent().removeClass('d-none');
        }
        else {
            swal('Atenção!','Esta Célula não tem Referências','warning');
        }
    }
...