在每个SelectList项上设置Selected = True不会影响渲染的ListBox

时间:2014-09-07 18:51:13

标签: c# asp.net-mvc

我整天都在乱搞这一个,而且我在最后一关。基本上我在我的一个表单上有一个多选列表,我用我的数据库填充数据。我有一个小工具'在我的模型中将属性定义为选择列表。

然后在我将数据库中的属性绑定到我的模型的部分中,我已经获得了linq表达式,它将另一个表中的属性添加到我的选择列表中。这一切都正常,我可以使用结果正确回发。但是,如果我在linq语句中设置selected = true属性,则在另一端不会选择任何内容。所以我的问题是为什么?所有其他属性,身份证等等都会通过罚款。

我的模特:

[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" })

非常感谢这里的任何帮助 - 我一整天都把头发拉出来,看起来非常简单。

提前致谢,

3 个答案:

答案 0 :(得分:2)

您想要选择列表的构造函数是:

new SelectList(items, data value field, text value field, **selected value**)

http://msdn.microsoft.com/en-us/library/dd492553(v=vs.118).aspx

编辑:对于任何来到这里且有问题的人并且想知道为什么会这样,当你从IEnumerable中创建一个选择列表时,选择列表不会基于(你认为直观的)生成它的项目selectlistitems。您只是为它提供了一个X类型的对象,并告诉它分别对datatextfield和datavaluefield使用属性Y和Z.选择列表知道您提供了一系列selectlistitems并不关心。它想知道在使用datavalueproperty Z查看类型X的对象时所选值是什么。

答案 1 :(得分:1)

更改将Obj.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)
};

答案 2 :(得分:1)

我认为您不应该将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)