簡體   English   中英

如何從多個選擇下拉列表中保存數據

[英]How to save data from multiple selection dropdown

我開始學習實體框架和asp.net,我想使用所有CRUD操作。 我有任務和類別模型,他們是多對多的關系。 在我的數據庫中有3個表:1。 任務 (它包含Id,標題,描述..),2。 類別 (它包含categoryId和categoryName)和3. TaskCategory (包含Id(taskId)和categoryId)。

我設法做了我想做的一切,除了使用下拉列表向任務添加多個類別。 我創建了下拉列表,並加載了類別,我知道如何向任務添加一個類別(當關系為1:N時)( asp-for="CategoryId" )。 對於多個選擇我嘗試使用selectedCategories (列出od整數 - ids)而不是CategoryId,但我不知道如何處理該列表。 如何在控制器中保存任務時在TaskCategory中加入類別和任務(換句話說:如何將類別保存到任務)?

AddTask.cshtml

<div class="form-group">
    <label class="control-label">Category</label>
    <select class="select-picker" asp-for="selectedCategories"
        asp-items="@(new SelectList(Model.Categories, "CategoryId", "CategoryName"))" multiple>
    </select>
</div>
<script>
    ...
     $('.select-picker').selectpicker('toggle');
</script>

HomeController.cs

public IActionResult AddTask()
{
    var categories = _categoryRepository.GetAllCategories().OrderBy(c => c.CategoryName);
    var taskCategories = _taskCategoryRepository.GetAllTaskCategories().OrderBy(tc => tc.Id);

    var homeViewModel = new HomeViewModel()
    {
        Task = null,
        TaskCategory = null,
        Categories = categories.ToList(),
        TaskCategories = taskCategories.ToList(),
        selectedCategories = new List<int>()
    };

    return View(homeViewModel);
}

[HttpPost]
public IActionResult AddTask(Task task, List<int> selected)
{
    // foreach (var selectedCategoryId in selected)
    // {
    //
    // }

    _taskRepository.AddTask(task);
    return RedirectToAction("Index");

    return View();
}

這樣我就可以在數據庫中獲取Task,但是沒有保存任何類別。

嘗試使用ViewModel來處理關系,以下是我制作的工作演示,您可以根據需要參考並進行修改

任務和類別之間的多對多關系:

public class Task
{
    public int Id { get; set; }
    public string Title { get; set; }
    public List<TaskCategory> TaskCategories { get; set; }
}
public class Category
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public List<TaskCategory> TaskCategories { get; set; }
}
public class TaskCategory
{
    public int CategoryId { get; set; }
    public Category Category { get; set; }

    public int TaskId { get; set; }
    public Task Task { get; set; }

}
   //DbContext
    public DbSet<Task> Task { get; set; }
    public DbSet<Category> Category { get; set; }
    public DbSet<TaskCategory> TaskCategory { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TaskCategory>()
            .HasKey(t => new { t.CategoryId, t.TaskId });

        modelBuilder.Entity<TaskCategory>()
            .HasOne(pt => pt.Category)
            .WithMany(p => p.TaskCategories)
            .HasForeignKey(pt => pt.CategoryId);

        modelBuilder.Entity<TaskCategory>()
            .HasOne(pt => pt.Task)
            .WithMany(t => t.TaskCategories)
            .HasForeignKey(pt => pt.TaskId);
    }

創建一個TaskViewModel,一個元素回發一個選定的選項值數組(在您的情況下,它將是Categories Id值的數組)。 您的模型需要綁定的屬性。 添加以下屬性:

public class TaskViewModel
{ 
    public Task Task { get; set; }
    public SelectList CategoryList { get; set; }
    public List<int> selectedCategories { get; set; }
}

AddTask.cshtml:

@model WebApplication1.Models.Tasks.TaskViewModel
<div class="row">
  <div class="col-md-4">
    <form asp-action="AddTask">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Task.Title" class="control-label"></label>
            <input asp-for="Task.Title" class="form-control" />
            <span asp-validation-for="Task.Title" class="text-danger"></span>
        </div>

        <div class="form-group">
            <label asp-for="selectedCategories" class="control-label"></label>
            <select asp-for="selectedCategories" class="form-control" asp-items="Model.CategoryList" multiple></select>
        </div>
        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </form>
  </div>
</div>

然后在Post方法中, selectedCategories的值將包含您在視圖中選擇的CategoryId值數組。

[HttpPost]
    public IActionResult AddTask(TaskViewModel taskVM)
    {
        Models.Tasks.Task task = taskVM.Task;
        _context.Add(task);
        _context.SaveChanges();

        foreach(var selectedId in taskVM.selectedCategories)
        {
            _context.TaskCategory.Add(new TaskCategory
            {
                TaskId = task.Id,
                CategoryId = selectedId,
            });
        }
        _context.SaveChanges();

        return RedirectToAction("Index");

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM