[英]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.