多选值无法传递给控制器

问题描述 投票:0回答:1

我尝试使用多选功能选择多个值并将它们传递给数据库,但无济于事。

模型的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);
c# asp.net-mvc postgresql asp.net-core
1个回答
0
投票

我们无法将对象的选择列表从视图传递到控制器。如果您想获得多个值的选择,例如 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>

结果:

© www.soinside.com 2019 - 2024. All rights reserved.