在每个SelectList项上设置Selected=True不会影响渲染的ListBox
本文关键字:影响 ListBox True SelectList Selected 设置 | 更新日期: 2023-09-27 18:21:09
我一整天都在处理这个问题,我已经到了最后一关。基本上,我在一个表单上有一个多选列表,我用数据库中的数据填充它。我在模型中定义了一个"Widgets"属性作为选择列表。
然后,在我将数据库中的属性绑定到模型的部分中,我得到了linq表达式,它将另一个表中的属性添加到我的选择列表中。这一切都很好,我可以用结果正确地发布回来。但是,如果我在linq语句中设置selected=true属性,那么在另一端就不会选择任何内容。所以我的问题是为什么?所有其他属性、id等都在顺利通过。
我的型号:
[DisplayName("Article Id")]
public int ArticleId { get; set; }
[DisplayName("Article Title")]
public string ArticleTitle { get; set; }
[DisplayName("Article Body")]
public string ArticleBody { get; set; }
[DisplayName("Publish on Site")]
public bool Published { get; set; }
[DisplayName("Add to Featured Articles")]
public bool Featured { get; set; }
[DisplayName("Created Date")]
public DateTime CreatedDate { get; set; }
public int AuthorId { get; set; }
[DisplayName("Author")]
public string Author { get; set; }
[DisplayName("Modified Date")]
public Nullable<DateTime> ModifiedDate { get; set; }
public int OwnerId { get; set; }
public SelectList Widgets { get; set; }
我的控制器(释放位)
ArticlesModel Obj = new ArticlesModel
{
ArticleId = row.ArticleId,
ArticleTitle = row.ArticleTitle,
ArticleBody = row.ArticleBody,
Featured = row.Featured,
Published = row.Published,
Widgets = new SelectList(db.Query("SELECT * FROM [Widgets]").Select(x => new SelectListItem { Text = x.WidgetName, Value = ((int)x.WidgetId).ToString(), Selected = true }), "Value", "Text")
};
Obj.SetGlobalProperties(this.ControllerContext.HttpContext.Application);
ViewData["Article"] = Obj;
最后查看
@Html.ListBoxFor(m => m.Widgets, Model.Widgets, new { @class = "form-control", @style = "margin-left: -20px !important; width: 500px" })
我真的很感激这里的任何帮助——我一整天都在用一些表面上看起来很简单的东西来拔头发。
提前感谢,
您想要的selectlist构造函数是:
new SelectList(items, data value field, text value field, **selected value**)
http://msdn.microsoft.com/en-us/library/dd492553(v=vs.118).aspx
编辑:对于任何来到这里并有问题并想知道为什么会这样的人来说,当你用IEnumerable创建一个选择列表时,选择列表并不是基于(你认为直观的)选择列表项目生成的。您只是为它提供了一个X类型的对象,并告诉它分别为datatextfield和datavaluefield使用属性Y和Z。选择列表不知道您为其提供了一个selectlistitems集合,它不在乎。当它使用datavalueproperty Z查看X类型的对象时,它想知道您选择的值是什么。
我认为不应该将available options
和selected options
混合使用。
您需要添加另一个属性来保存selected options
,并将available options
类型从SelectList
更改为SelectListItem[]
。
public SelectListItem[] Widgets { get; set; }
public int[] SelectedWidgets { get; set; } // depends on WidgetId type
将其更改为SelectListItem[]
。
Widgets = db.Query("SELECT * FROM [Widgets]")
.Select(x => new SelectListItem
{
Text = x.WidgetName,
Value = ((int)x.WidgetId).ToString(),
Selected = true
})
.ToArray()
html
@Html.ListBoxFor(m => m.SelectedWidgets, Model.Widgets)
更改将对象小部件分配给以下对象的方式:
var selectedValues = new List<int> { 1, 2, 3 };
ArticlesModel Obj = new ArticlesModel
{
ArticleId = row.ArticleId,
ArticleTitle = row.ArticleTitle,
ArticleBody = row.ArticleBody,
Featured = row.Featured,
Published = row.Published,
Widgets = new MultiSelectList(
db.Query("SELECT * FROM [Widgets]"),
"WidgetId",
"WidgetName",
selectedValues)
};