Как сделать каскадный выпадающий список в asp.net ядро mvc?

#asp.net-core #asp.net-core-mvc

#asp.net-ядро #asp.net-core-mvc

Вопрос:

Я пытался раньше, но не могу добиться успеха в этом.

Может кто-нибудь рассказать мне с примером?

Комментарии:

1. множество руководств и видеороликов о том, как сделать это шаг за шагом, чтобы вы могли следовать следующим образом c-sharpcorner.com/article /…

2. вы можете использовать вызов jQuery Ajax при изменении родительского значения выпадающего списка. вот пример с раскрывающимся списком категорий и подкатегорий — geeksarray.com/blog /…

3. Я тоже пробовал этот метод, но не могу работать

Ответ №1:

Вы могли бы обратиться к следующим шагам для создания каскадного выпадающего списка в asp.net ядро MVC.

  1. Создание моделей с отношениями:
      public class Category
     {
         public int Id { get; set; }
    
         [Required]
         [Display(Name = "Category Name")]
         public string CategoryName { get; set; }
    
         public ICollection<SubCategory> SubCategories { get; set; }
     }
    
     public class SubCategory
     {
         public int Id { get; set; }
    
         [Required]
         [Display(Name = "SubCategory Name")]
         public string SubCategoryName { get; set; }
    
         public int CategoryID { get; set; }
    
         public Category Category { get; set; }
     }
     
  2. Затем используйте EF core migration для создания связанных таблиц в базе данных или создайте сервис для установки исходных данных. Здесь я создаю сервис:
      public interface IRepository
     {  
         List<Category> GetCategories(); 
     }
    
     public class Repository : IRepository
     {
         private readonly ApplicationDbContext db;
         public Repository(ApplicationDbContext context)
         {
             db = context;
         }
         //you can also query the database and get the data.
    
         public List<Category> GetCategories()
         {
             List<Category> categories = new List<Category>()
             {
                 new Category(){ Id=101, CategoryName="Category 1", 
                     SubCategories= new List<SubCategory>(){
                     new SubCategory(){ Id=1001, SubCategoryName="SubCategory 1.1"},
                     new SubCategory(){ Id=1002, SubCategoryName="SubCategory 1.2"},
                     new SubCategory(){ Id=1003, SubCategoryName="SubCategory 1.3"},
                     }
                 },
                 new Category(){ Id=102, CategoryName="Category 2",
                     SubCategories= new List<SubCategory>(){
                     new SubCategory(){ Id=1001, SubCategoryName="SubCategory 2.1"},
                     new SubCategory(){ Id=1002, SubCategoryName="SubCategory 2.2"},
                     new SubCategory(){ Id=1003, SubCategoryName="SubCategory 2.3"},
                     }
                 },
                 new Category(){ Id=103, CategoryName="Category 3",
                     SubCategories= new List<SubCategory>(){
                     new SubCategory(){ Id=1001, SubCategoryName="SubCategory 3.1"},
                     new SubCategory(){ Id=1002, SubCategoryName="SubCategory 3.2"},
                     new SubCategory(){ Id=1003, SubCategoryName="SubCategory 3.3"},
                     }
                 },
    
             };
    
             return categories;
         }
     }
     
  3. Зарегистрируйте службу при запуске.Метод конфигурирования служб:
          services.AddTransient<IRepository, Repository>();
     
  4. Затем в контроллере MVC, используя следующий код, чтобы получить категорию и подкатегорию:
      public class HomeController : Controller
     { 
         private readonly ApplicationDbContext _context; //db context.
         private readonly IRepository _repository;
         public HomeController( ApplicationDbContext context, IRepository repository)
         { 
             _context = context; 
             _repository = repository;
         }
    
         public IActionResult CreateIndex() {
    
             //get the categories.
             ViewBag.CategoryId = _repository.GetCategories().Select(c => new SelectListItem { Value= c.Id.ToString(),Text = c.CategoryName }).ToList();
    
             return View();
         }
         //get Subcategory based on the category id
         public IActionResult GetSubCategory(int cid)
         {
             var SubCategory_List = _repository.GetCategories().Where(s => s.Id == cid).FirstOrDefault().SubCategories.Select(c => new { Id = c.Id, Name = c.SubCategoryName }).ToList();
             return Json(SubCategory_List);
         }
         [HttpPost]
         public IActionResult CreateIndex(ProductViewModel product)
         { 
             return View();
         }
     
  5. кодируйте на странице просмотра (createIndex.cshtml), заполняйте только выпадающий список категорий при загрузке страницы, затем с помощью jQuery вызывайте метод действия и заполняйте подкатегорию:
      @model MVCDemo.Models.ProductViewModel
    
     @{
         ViewData["Title"] = "CreateIndex";
     }
    
     <div class="row">
         <div class="col-md-4">
             <form asp-action="CreateIndex">
                 <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                 <div class="form-group">
                     <label asp-for="Name" class="control-label"></label>
                     <input asp-for="Name" class="form-control" />
                     <span asp-validation-for="Name" class="text-danger"></span>
                 </div>
                 <div class="form-group"> 
                         <label asp-for="CategoryTypeId" class="control-label">Category Type</label> 
                         <select asp-for="CategoryTypeId" asp-items="ViewBag.CategoryId" class="form-control">
                             <option value="">Select Category</option>
                         </select>  
                 </div>
                 <div class="form-group"> 
                         <label asp-for="SubCategoryTypeId" class="control-label">SubCategory Type</label> 
                         <select asp-for="SubCategoryTypeId" class="form-control"></select> 
                 </div>
                 <div class="form-group">
                     <input type="submit" value="Create" class="btn btn-primary" />
                 </div>
             </form>
         </div>
     </div>
    
     @section Scripts{ 
     <script>
         $(function () {
             $("select#CategoryTypeId").change(function () {
                 var cid = $(this).val();
    
                 $("select#SubCategoryTypeId").empty();
    
                 $.getJSON(`/Home/GetSubCategory?cid=${cid}`, function (data) {
                     //console.log(data);
                     $.each(data, function (i, item) {
                         $("select#SubCategoryTypeId").append(`<option value="${item.id}">${item.name}</option>`);
                     });
                 });
             })
         });
     </script>
     }
     

Скриншот, как показано ниже:

введите описание изображения здесь

Комментарии:

1. Как я могу сделать это с помощью извлечения данных из базы данных? ваш метод верен, но я попытался извлечь данные из своей базы данных, и он не сработал (с использованием EF)

2. Привет @DishankPatil, вы сталкиваетесь с какой-либо ошибкой при извлечении данных из базы данных? Из вашего описания вы используете EF вместо EF core, верно?

3. используя EF core, и у меня нет никаких ошибок при извлечении данных из базы данных, но моя подкатегория не может отображаться при использовании базы данных для извлечения данных. Ваш метод правильный и работает правильно, но с помощью базы данных я не могу получить вторые выпадающие данные после выбора первого выпадающего списка

4. Во-первых, вы могли бы установить точку останова в методе действия GetSubCategory и проверить, можете ли вы получить правильный идентификатор категории. Затем, на основе идентификатора категории для запроса таблицы подкатегорий, код, подобный этому: var SubCategory_List=_db.SubCategory.Where(s => s.CategoryId == cid).Select(c => new { Id = c.Id, Name = c.SubCategoryName }).ToList(); , вы также можете установить точку останова для проверки результата, а затем вернуть этот список. Наконец, если все еще не работает, установите отладчик в методе jquery, убедитесь, что вы получаете данные и используете правильный JS-селектор для заполнения записей.

Ответ №2:

В этом не должно быть ничего особенного в ASP.Net Core, поскольку представления по-прежнему создаются на основе базовых HTML и CSS, и вы можете использовать JS.

Я бы рекомендовал следовать этому руководству от W3Schools по теме: https://www.w3schools.com/howto/howto_js_cascading_dropdown.asp

Как вы можете видеть, в руководстве этот вложенный массив используется в качестве выпадающих данных:

 var subjectObject = {
  "Front-end": {
    "HTML": ["Links", "Images", "Tables", "Lists"],
    "CSS": ["Borders", "Margins", "Backgrounds", "Float"],
    "JavaScript": ["Variables", "Operators", "Functions", "Conditions"] 
  },
  "Back-end": {
    "PHP": ["Variables", "Strings", "Arrays"],
    "SQL": ["SELECT", "UPDATE", "DELETE"]
  }
}
 

Если ваши выпадающие данные статичны, вы можете напрямую поместить их в код JS, но я бы рекомендовал сгенерировать их на стороне сервера, а затем либо:

  1. передайте его как данные представления, сериализуйте его в json и замените инициализацию массива в коде JS вашей буквальной строкой json
  2. выполните второй запрос от клиента к серверу (например, используя XHR) к какой-либо конечной точке API и загрузите выпадающие данные в формате json, затем десериализуйте их и поместите данные в выпадающий массив данных. (В этом случае не забудьте перезагрузить фактические параметры выпадающих элементов)

Не стесняйтесь обращаться за разъяснениями, если что-то было нелегко понять.