Проект ASP .NET Core. Есть модель представления - IndexViewModel.
IndexViewModel
namespace VartanMVCv2.ViewModels
{
public class IndexViewModel
{
public _ViewStartModel _viewStartModel = new _ViewStartModel();
public Client ClientExample { get; set; } = new Client();
public Feedback FeedbackExample { get; set; } = new Feedback();
public IEnumerable<WorksList> sortWorksList { get; set; } = new List<WorksList>();
private readonly DbContext _dbContext;
private readonly ILogger<IndexViewModel> _logger;
private readonly Modelinitializer _initializer;
public DataModel dataModelExample;
public IndexViewModel() {}
public IndexViewModel( AplicationDBContext appDBContext, ILogger<IndexViewModel> logger, Modelinitializer modelinitializer)
{
_dbContext = appDBContext;
_logger = logger;
_initializer = modelinitializer;
dataModelExample = _initializer.dataModel;
}
public void SetInstance(DataModel model)
{
dataModelExample = model;
}
}
}
Есть две формы в которых настроена валидация на две модели Client и Feedback.
ClientForm
@model VartanMVCv2.ViewModels.IndexViewModel
<div class="pop_up" id="pop_up">
<div class="pop_up_container">
<div class="pop_up_body">
<div class="grid_form_container">
<div class="grid_item">
<div id="p_div_conteiner">
<p id="p_textForm">Оставьте заявку на бесплатную консультацию, и мы перезвоним вам в удобное для вас время.</p>
</div>
<form asp-controller="home" asp-action="index" method="post" id="entryForm">
<p2 class="validation_text">
<input class="text_input_form" placeholder="Имя" asp-for="@Model.ClientExample.Name" data-val-required="Это поле не долно быть пустым" />
<span asp-validation-for="@Model.ClientExample.Name" />
</p2>
<p2 class ="validation_text">
<input class="text_input_form" type="tel" data-tel-input maxlength="18" placeholder="Телефон" asp-for="@Model.ClientExample.Phone" data-val-required="Это поле не долно быть пустым" />
<span asp-validation-for="@Model.ClientExample.Phone" />
</p2>
<p2 class="validation_text">
<input class="text_input_form" type="email" placeholder="Email" asp-for="@Model.ClientExample.Email" data-val-email="Некорректный Email адрес" />
<span asp-validation-for="@Model.ClientExample.Email" />
</p2>
<div class="time_selection">
<label for="time" class="lab_chk_time">Позвонить с: </label>
<input type="datetime-local" id="time" asp-for="@Model.ClientExample.CallTime" />
</div>
<button name="acceptBtn" id="accept" type="submit" value="Send">Создать заявку</button>
<label class="lab_chk_time"> Создавая заявку, вы даёте согласие на обработку персональных данных. </label>
</form>
<div class="pop_up_close" id="pop_up_close">✖</div>
</div>
<div class="grid_item_1" >
<div class="image_person"><img src="~/images/form_person1.png"></div>
</div>
</div>
</div>
</div>
</div>
FeedbackForm
@model VartanMVCv2.ViewModels.IndexViewModel
<div class="pop_up" id="feedback_pop_up">
<div class="pop_up_container">
<div class="pop_up_body">
<div class="grid_form_container">
<div class="grid_item">
<div id="p_div_conteiner">
<p id="p_textForm">Если вы уже являетесь нашим клиентом, оставьте свой отзыв о работе компании. Мы ценим мнение наших клиентов.</p>
</div>
<form asp-controller="home" asp-action="AddFeedback" method="post" id="feedbackForm">
<p2 class="validation_text">
<input class="text_input_form" placeholder="Ваше имя" asp-for="@Model.FeedbackExample.FeedbackClientName" data-val-required="Это поле не должно быть пустым" />
<span asp-validation-for="@Model.FeedbackExample.FeedbackClientName" />
</p2>
<p2 class="validation_text">
<input class="text_input_form" type="tel" data-tel-input maxlength="18" placeholder="Телефон(Не виден другим пользователям)" asp-for="@Model.FeedbackExample.FeedbackPhone" />
<span asp-validation-for="@Model.FeedbackExample.FeedbackPhone" />
</p2>
<p2 class="validation_text">
<input class="text_input_form" type="email" placeholder="Email(Не виден другим пользователям)" asp-for="@Model.FeedbackExample.FeedbackEmail" data-val-email="Некорректный Email адрес" />
<span asp-validation-for="@Model.FeedbackExample.FeedbackEmail" />
</p2>
<p2 class="validation_text">
<textarea class="text_input_form" type="text" placeholder="Текст отзыва" asp-for="@Model.FeedbackExample.FeedbackText" data-val-required="Это поле не должно быть пустым"></textarea>
<span asp-validation-for="@Model.FeedbackExample.FeedbackText" />
</p2>
<button name="acceptBtn" id="feedback_accept" type="submit" value="Send">Добавить отзыв</button>
<label class="lab_chk_time"> Ваши контактные данные недоступны другим пользователям. Поля "Email" и "Телефон" необязательны. </label>
</form>
<div class="pop_up_close" id="feedback_pop_up_close">✖</div>
</div>
<div class="grid_item_1">
<div class="image_person"><img src="~/images/form_person1.png"></div>
</div>
</div>
</div>
</div>
</div>
В контроллере Home, в двух разных экшенах передаю модель представления и получаю данные из соответствующих форм, вроде все корректно.
Но при валидации модели, в ModelState словарь попадают свойства другой модели из IndexViewModel. В чем может быть дело?
Код контроллера:
spoiler
[HttpPost]
public async Task<IActionResult> Index(IndexViewModel client)
{
_logger.LogInformation("Начинает выполнение Home/Index, [тип запроса: POST]");
foreach (var item in ModelState)
{
_logger.LogInformation($"Пара ключ значение {item}");
}
if (ModelState.IsValid)
{
_logger.LogInformation("Екземпляр клиента успешно прошел валидацию на стороне сервера [VALIDATE]");
await _dataManager.ClientRepository.AddedAsync(client.ClientExample);
return View("Confirm");
}
_logger.LogInformation("Екземпляр клиента НЕ прошел валидацию на стороне сервера [NOT VALID]");
//_indexViewModel.ClientExample = client.ClientExample;
return RedirectToAction("IndexToContact",client);
}
[HttpPost]
public async Task<IActionResult> AddFeedbackAsync(IndexViewModel feedback)
{
// _indexViewModel.FeedbackExample = feedback.FeedbackExample;
_logger.LogInformation("Начинает выполнение Home/AddFeedbackAsync, [тип запроса: POST]");
_logger.LogInformation($"Все поля модели: Имя {feedback.FeedbackExample.FeedbackClientName} + \n" +
$"Телефон {feedback.FeedbackExample.FeedbackPhone}+\n" +
$"Текст отзыва {feedback.FeedbackExample.FeedbackText}");
foreach (var item in ModelState)
{
_logger.LogInformation($"Пара ключ значение {item}");
}
if (ModelState.IsValid)
{
_logger.LogInformation("Екземпляр отзыва клиента успешно прошел валидацию на стороне сервера [VALIDATE]");
await _dataManager.Feedback.AddedAsync(feedback.FeedbackExample);
return View("Confirm");
}
_logger.LogInformation("Екземпляр клиента НЕ прошел валидацию на стороне сервера [NOT VALID]");
string validErrors = "";
foreach (var item in ModelState)
{
// если для определенного элемента имеются ошибки
if (item.Value.ValidationState == ModelValidationState.Invalid)
{
validErrors = $"{validErrors}\n Ошибки для свойства {item.Key}:\n";
_logger.LogInformation(validErrors);
// пробегаемся по всем ошибкам
foreach (var error in item.Value.Errors)
{
validErrors = $"{validErrors}{error.ErrorMessage}\n";
_logger.LogInformation(validErrors);
}
}
}
//_indexViewModel.FeedbackExample = feedback.FeedbackExample;
return RedirectToAction("Index", feedback);
}