ASP. NET Core MVC - недопустимая операция Исключение Нет данных вида типа Ienumerable <SelectListItem> - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь каскадировать названия государств в соответствии с названием страны, выбранным в раскрывающемся списке Страна. Я написал JS для метода публикации для выбранной страны. Но когда я добавил раскрывающийся список состояний и отладил его. Я получаю сообщение об ошибке - Нет Viewdata типа Ienumerable ключа StateName1.

NewRequestView Модель

public class NewRequestView 
{    
    public string SelectedCountry { get; set; }
    public IEnumerable<SelectListItem> Countries { get; set; }
    public IEnumerable<SelectListItem> State { get; set; }        
}

Модель страны

public class Country
{
    public int CountryID { get; set; }
    public string CountryName { get; set; }
}

Контроллер

 public IActionResult NewRequest()
    {
        var model = new NewRequestView { };                      
        model.Countries = iMapper.Map<IEnumerable<Country>, IEnumerable<SelectListItem>>(GetCountries());            
        return View(model);
    }

Просмотр

                             <div class="row">
                                <div class="col-xs-10 multiSelectCheckboxDiv" id="multiSelectCheckboxDiv">
                                    <span class="col1 contrlLabel" style=" font-family:calibri;color:gray;font-size:15px">Clients<span style="font-weight:800;color:red;">*</span>:</span>
                                    @Html.DropDownList("CountryName", Model.Countries ,"Select Country",new { @class = "form-control"})
                                    <div class="input-validation-errorText col-md-6" style="display:none;">
                                        Please select Country.
                                    </div>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-xs-10 multiSelectCheckboxDiv" id="multiSelectCheckboxDiv">
                                    <span class="col1 contrlLabel" style=" font-family:calibri;color:gray;font-size:15px">Clients<span style="font-weight:800;color:red;">*</span>:</span>
                                    @Html.DropDownList("StateName1", Model.State, "Select State", new { @class = "form-control" })
                                    <div class="input-validation-errorText col-md-6" style="display:none;">
                                        Please select state.
                                    </div>
                                </div>
                            </div>

Я использовал AutoMapper для сопоставления названий стран.

Mapper

 var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Client, SelectListItem>()
             .ForMember(x => x.Text, opt => opt.MapFrom(o => o.CountryName))
             .ForMember(x => x.Value, opt => opt.MapFrom(o => o.CountryName));

        });
        return config.CreateMapper();

Из выбранной страны я запускаю JS, чтобы получить все государственные имена. Но перед тем, как выбрать себя, я получаю сообщение об ошибке

InvalidOperationException: Нет элемента ViewData типа 'IEnumerable', который имеет ключ 'StateName1'.

Позвольте мне знаете, что за ошибка, которую я здесь делаю

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Вам нужно сделать AJAX вызов, чтобы получить Штаты, передав идентификатор страны вашему методу и вернув StateList в JSON.

Проверьте Пример раскрывающегося списка для Пошаговое руководство.

0 голосов
/ 22 марта 2020

Исключение из-за недопустимой операции Нет никаких данных вида типа Ienumerable

Это вызвано тем, что в вашем представлении для нулевого списка передается Html.DropdownList().

Просмотр действие вашего контроллера, у вас нет ничего, что давало бы значение model.State.

public IActionResult NewRequest()
{
   var model = new NewRequestView { };                      
   model.Countries = iMapper.Map<IEnumerable<Country>, IEnumerable<SelectListItem>>(GetCountries());

   // you need something like this
   model.State = new List<SelectListItem>(){
      new SelectListItem(){ Text = "Test", Value = "Test" }
   };

   return View(model);
}

Другой вариант заключается в том, что отчеты о состоянии будут поступать из события ajax после выбора страны. Вы можете просто оставить модель. Оставьте поле пустым и не используйте Html.Dropdown().

Вы можете сделать это; Созданное вручную поле выбора будет по-прежнему распознаваться как часть модели при отправке формы.

<div class="row">
   <div class="col-xs-10 multiSelectCheckboxDiv" id="multiSelectCheckboxDiv">
      <span class="col1 contrlLabel" style=" font-family:calibri;color:gray;font-size:15px">Clients<span style="font-weight:800;color:red;">*</span>:</span>

      <select id="StateName1" name="Model.State" class="form-control">
         <option>Select State</option>
      </select>
      <div class="input-validation-errorText col-md-6" style="display:none;">
         Please select state.
      </div>

   </div>
</div>
...