在每个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项上设置Selected=True不会影响渲染的ListBox

您想要的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 optionsselected 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)
};