Acceptme3
@Acceptme3

Почему при валидации одной модели подтягиваются свойства из другой?

Проект 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">&#10006</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">&#10006</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);
        }

  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
Acceptme3
@Acceptme3 Автор вопроса
Разобрался с проблемой, если кому вдруг пригодится. Просто вынес инициализацию моделей из ViewModel в соответствующие экшены контроллера перед валидацией.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы