Вот моя проблема, у меня есть простая форма, которая делится на шаги.
- Пользователь вводит свой номер
- Опубликовать, чтобы проверить базу данных на предмет пользовательских данных и вернуть доступные 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');
}
}