Skip to main content
 首页 » 编程设计

c#之带有集合的模型之Html.ListBoxFor 未设置选定项

2024年01月22日29Free-Thinker

这让我发疯了,在我失去理智之前请帮忙。

问题总结:
我的模型“线程”有“论坛消息”的集合,每个论坛消息都有一个多选下拉列表。我要做的就是根据来自数据库的值设置选定的值。我已经通过了很多线程,但无法找到解决方案。

如果您知道任何此类问题,请告诉我,我会通过它们。

下面是我的模型

public class Thread 
{ 
    public List<ForumMessage> Messages { get; set; } 
    //Master list coming from DB 
    public List<Classifications> AllClassifications { get; set; } 
    public string Subject { get; set; } 
    public int[] ThreadSelectedClassifications { get; set; } 
} 
 
public class ForumMessage 
{ 
    public string MessageName { get; set; } 
    public int[] SelectedClassifications { get; set; } 
} 
 
public class Classifications 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

下面是我的 Controller
public ActionResult Index() 
{ 
    var thread = new Thread(); 
    thread.Messages = new List<ForumMessage>(); 
 
    thread.AllClassifications = new List<Classifications>()  
    {  
        new Classifications { ID = 1, Title = "One"   , Description = "One"   },  
        new Classifications { ID = 2, Title = "Two"   , Description = "Two"   },  
        new Classifications { ID = 3, Title = "Three" , Description = "Three" },  
        new Classifications { ID = 4, Title = "Four"  , Description = "Four"  },  
        new Classifications { ID = 5, Title = "Five"  , Description = "Five"  }  
    }; 
    thread.ThreadSelectedClassifications = new int[] { 2, 4 }; 
    for (int i = 0; i < 5; i++) 
    { 
        var post = new ForumMessage(); 
        post.SelectedClassifications = new int[] { 2, 4 }; 
        post.MessageName = i.ToString(); 
        thread.Messages.Add(post); 
    } 
 
    return View(thread);     

下面是我的看法
@model MultiSelectDemo.Controllers.Thread 
@foreach (var item in Model.Messages) 
{ 
    <div class="row"> 
        <div class="col-md-4"> 
            @*@Doesn't set the items selected *@ 
            @Html.ListBoxFor(m => item.SelectedClassifications, new SelectList(Model.AllClassifications, "ID", "Title")); 
        </div> 
 
        <div class="col-md-4"> 
            @* Doesn't set the items selected  *@ 
            @Html.ListBoxFor(m => item.SelectedClassifications, new SelectList(Model.AllClassifications, "ID", "Title", item.SelectedClassifications)); 
        </div> 
        <div class="col-md-4"> 
            @* Doesn't set the items selected  *@ 
            @Html.DropDownListFor(m => item.SelectedClassifications, new SelectList(Model.AllClassifications, "ID", "Title", item.SelectedClassifications), new { @multiple = "multiple" }) 
        </div> 
    </div> 
} 
<hr /> 
<div class="row"> 
    <div class="col-md-12"> 
        This works. 
        @Html.ListBoxFor(m => m.ThreadSelectedClassifications, new MultiSelectList(Model.AllClassifications, "ID", "Title")) 
    </div> 
</div> 

}

请您参考如下方法:

SelectList仅支持单个选定值,因此在您的代码示例中,您告诉它将选定值设置为具有整个选定值列表的值的选项。由于不存在此类选项,因此未选择任何内容。
MultiSelectList另一方面,允许传递选定值的可枚举。如果你使用正确的类,你会没事的。

@Html.ListBoxFor(m => item.SelectedClassifications, new MultiSelectList(Model.AllClassifications, "ID", "Title", item.SelectedClassifications))