C# 当我不希望使用multiple=“multiple”时,请选择List rendering with multiple

C# 当我不希望使用multiple=“multiple”时,请选择List rendering with multiple,c#,asp.net-core,razor-pages,C#,Asp.net Core,Razor Pages,我正在尝试创建一个简单的SelectList,它作为下拉列表呈现,以便在使用RazorPages生成的创建表单中使用。出于某种原因,SelectList以multiple=multiple呈现,这会导致所有选项显示在一个框架中,并在侧面显示滚动条,而不是下拉框。我认为问题在于我的控制器,以及我正在尝试使用匿名类型设置SelectListItems的文本和值属性,因为我在不设置这些属性时已经达到了预期的结果 这对我来说是非常新鲜的,所以如果有人对我的代码有任何一般性的建议,我将不胜感激 以下是我的

我正在尝试创建一个简单的SelectList,它作为下拉列表呈现,以便在使用RazorPages生成的创建表单中使用。出于某种原因,SelectList以multiple=multiple呈现,这会导致所有选项显示在一个框架中,并在侧面显示滚动条,而不是下拉框。我认为问题在于我的控制器,以及我正在尝试使用匿名类型设置SelectListItems的文本和值属性,因为我在不设置这些属性时已经达到了预期的结果

这对我来说是非常新鲜的,所以如果有人对我的代码有任何一般性的建议,我将不胜感激

以下是我的视图模型:

public class CreateFileViewModel
    {
        public SelectList EnrolleeId { get; set; }
        public SelectList GroupId { get; set; }

        [DataType(DataType.Date)]
        public DateTime StartDate { get; set; }

        public string Status { get; set; }
    }
这是我的控制器:

public IActionResult TestCreate()
        {
            //query items for SelectLists
            var users = from u in _context.Users
                        orderby u.LastName
                        select u;

            var groups = from g in _context.Group
                         orderby g.Name
                         select g;

            // Loop through queries above and convert to collections of SelectListItems
            var enrolleeSelectListItems = from u in users
                                        select new SelectListItem()
                                        {
                                            Value = u.Id.ToString(),
                                            Text = u.LastName + ", " + u.FirstName + " " + u.MiddleName
                                        };

            var groupSelectListItems = from g in groups
                                         select new SelectListItem()
                                         {
                                             Value = g.ID.ToString(),
                                             Text = g.Name
                                         };

            //convert SelectListItem collections into SelectLists within view
            var cfvm = new Models.TestModels.CreateFileViewModel();
            cfvm.EnrolleeId = new SelectList(enrolleeSelectListItems, "Value", "Text");
            cfvm.GroupId = new SelectList(groupSelectListItems, "Value", "Text");

            return View(cfvm);
        }
这是我观点的相关部分:

<div class="form-group">
                <label asp-for="EnrolleeId" class="control-label"></label>
                <select asp-for="EnrolleeId" asp-items="Model.EnrolleeId">
                    <option value="">Select</option>
                </select>
            </div>
以下是它在浏览器中的渲染方式:

<select id="EnrolleeId" multiple="multiple" name="EnrolleeId" aria-invalid="false" class="valid">
                    <option value="">Select</option>
                    <option value="3e60fabd-6901-45a1-ae2a-5056d77f415c"></option>
                    <option value="40ce8b6e-62a5-4c3c-808b-90e36d633ec0"></option>
                    <option value="c0c49df2-da52-4a01-9a8a-47bab6f5496d"></option>
</select>

因为您用于asp for EnrolleeId的属性是集合类型。SelectList实现IEnumerable

理想情况下,您应该有两个属性,一个用于构建选项列表所需的项目集合,另一个用于所选选项值

public class CreateFileViewModel
{
    public int SelectedEnrolleId {set;get;}  // This new one
    public SelectList EnrolleeId { get; set; }

    public SelectList GroupId { get; set; }
    [DataType(DataType.Date)]
    public DateTime StartDate { get; set; }
    public string Status { get; set; }
}
在我看来

<select asp-for="SelectedEnrolleId" asp-items="Model.EnrolleeId">
    <option value="">Select</option>
</select>

这将呈现名称和id属性值设置为SelectedErrorId的select元素。因此,当您提交表单时,您应该在那里阅读它。

这就解决了它。谢谢你的快速回复!我建议您将SelectList属性重命名为类似EnrolleeId中的EnroleList,这更有意义。重命名SelectList属性是为了更清晰,还是有命名约定或我违反了某些规定?我还注意到,您已经在LINQ queryenrolleeSelectListItems中创建了一个SelectListItem对象列表,并从中创建了另一个SelectList。这是多余和不必要的。您可以使用列表作为EnrolleeId属性的类型。请参阅本文以了解不同的选项