我尝试使用多选功能选择多个值并将它们传递给数据库,但无济于事。
模型的M-M关系
public class Cluster : IEntityBase<string>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get; set; }
[Required]
public string Name { get; set; }
public IEnumerable<Sensor> Sensors { get; set; }
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get; set; }
public string Name { get; set; }
public IEnumerable<Cluster> Clusters { get; set; }
[ForeignKey("SensorType")]
public string SensorTypeId { get; set; }
public SensorType SensorType { get; set; }
存储库模式
private readonly ApplicationDbContext _db;
public SensorRepository(ApplicationDbContext db) {
_db = db;
}
public void Add(SensorVM entity)
{
Sensor mappedSensor = new Sensor()
{
Id = entity.Id,
Name = entity.Name,
Clusters = entity.Clusters,
SensorTypeId = entity.SensorTypeId,
SensorType = entity.SensorType,
APIUrl = entity.APIUrl,
X = entity.X,
Y = entity.Y,
Configuration = entity.Configuration,
ConfigurationSchema = schema.ToJson(),
SerialNumber = entity.SerialNumber,
Interval = entity.Interval,
IsActive = entity.IsActive
};
_db.Sensors.Add(mappedSensor);
_db.SaveChanges();
}
控制器代码
[HttpGet]
public IActionResult Add()
{
IEnumerable<Cluster> getClusters = _clusterRepository.GetAll().ToList();
ViewData["Clusters"] = new MultiSelectList(getClusters, "Id", "Name");
...
return View();
}
[HttpPost]
public IActionResult Add(SensorVM obj)
{
if (ModelState.IsValid)
{
_sensorRepository.Add(obj);
return RedirectToAction("Index");
}
return View(obj);
}
查看代码
<div class="form-floating py-2 col-12">
<select asp-for="Clusters" asp-items="(MultiSelectList)@ViewData["Clusters"]" multiselect-search="true" multiple placeholder="-Select Clusters-">
<span asp-validation-for="Clusters" class="text-danger"></span>
</select>
</div>
它显示 Clusters = null。
我怀疑我错过了某种 ID 操作 - 将它们收集在列表中。利用M-m关系,在db中创建了一个由SensorId和ClusterId组成的ClusterSensor表。
另一件事是我缺少填充 MultiSelectList 的“selectedValues”参数的方法。
public MultiSelectList(IEnumerable items, string dataValueField, string dataTextField, IEnumerable selectedValues);
我们无法将对象的选择列表从视图传递到控制器。如果您想获得多个值的选择,例如 ClusterIds,我们可以在 SensorVM 模型中添加属性
ClusterIds
,例如:
public IEnumerable<Cluster> Clusters { get; set; }
public int[] ClusterIds { get; set; }
然后在视图中:
<div class="form-floating py-2 col-12">
<select asp-for="ClusterIds" asp-items="(MultiSelectList)@ViewData["Clusters"]" multiselect-search="true" multiple placeholder="-Select Clusters-">
<span asp-validation-for="ClusterIds" class="text-danger"></span>
</select>
</div>
结果: