我整天都在乱搞这一个,而且我在最后一关。基本上我在我的一个表单上有一个多选列表,我用我的数据库填充数据。我有一个小工具'在我的模型中将属性定义为选择列表。
然后在我将数据库中的属性绑定到我的模型的部分中,我已经获得了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" })
非常感谢这里的任何帮助 - 我一整天都把头发拉出来,看起来非常简单。
提前致谢,
答案 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 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)