[英]Trying to get a dropdown working in asp.net core
我试图在asp.net core中使用下拉菜单,但它似乎并不喜欢它应该用来填充工作人员的第一个列表。 我有一个称为活动标题的表,该表的外键字段人员ID链接到人员表。
首先,这是我在本教程中尝试的代码
public IEnumerable<SelectListItem> GetStaff()
{
List <SelectListItem> staff = _db.Staff.AsNoTracking();
List <SelectListItem> selectListItems = _db.Staff.AsNoTracking()
.OrderBy(n => n.FirstName)
.Select(n =>
new SelectListItem
{
Value = n.StaffID.ToString(),
Text = n.FirstName.ToString() + " " + n.LastName.ToString()
}).ToList();
var stafftip = new SelectListItem()
{
Value = null,
Text = "--- select staff memeber---"
};
staff.Insert(0, stafftip );
return new SelectList(staff, "Value", "Text");
}
我的活动标题类
public class ActivityHeader
{
// other fields removed for brevity
[Required]
[Display(Name = "Staff")]
public int StaffId { get; set; }
public IEnumerable<Staff> Staff { get; set; }
}
我的工作人员班级应该链接到带有工作人员ID的其他表
public class Staff
{
[Key]
public int StaffID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int DepartmentId { get; set; }
public string StaffNumber { get; set; }
public virtual IEnumerable<Staff> Staff { get; set; }
}
这是我的html视图,位于引导弹出窗口中。
<div class="col-sm-3">
<label for="inputPostalCode">SOP</label>
<div class="form-group">
@Html.LabelFor(x => Model.Staff, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-5">
@Html.DropDownListFor(x => Model.StaffId, new SelectList(Model.Staff, "Value", "Text"), htmlAttributes: new { @class = "form-control", id = "Country" })
@Html.ValidationMessageFor(x => x.StaffId, "", new { @class = "text-danger" })
</div>
</div>
</div>
我希望看到的是带有工作人员结果的html下拉列表,但链接到带有工作人员ID的活动头。
但是由于某种原因,它似乎并不喜欢此列表。 确切的错误是
我看到您的DropDownList
实现中有一些错误:
1号 :
如果要从DropDownList
未选择任何项目,则将传递选择列表的null
值,则无需设置DropDownList
级文本,如下所示:
var stafftip = new SelectListItem()
{
Value = null,
Text = "--- select staff memeber---"
};
staff.Insert(0, stafftip );
而是简单地按如下方式获取您的GetStaff()
方法:
public SelectList GetStaff()
{
var staffList = _db.Staff.Select(s => new
{
Value = s.StaffID,
Text = s.FirstName + " " + s.LastName
}).ToList();
return new SelectList(staffList, "Value", "Text");
}
现在,在模型类中,替换public virtual IEnumerable<Staff> Staff { get; set; }
public virtual IEnumerable<Staff> Staff { get; set; }
public virtual IEnumerable<Staff> Staff { get; set; }
与public SelectList Staff { get; set; }
public SelectList Staff { get; set; }
然后在视图中:
@Html.DropDownListFor(x => Model.StaffId, Model.Staff,"Select Staff", htmlAttributes: new { @class = "form-control", id = "Country" })
2号:
如果需要,如果没有从DropDownList
选择任何项目,则将传递选择列表的default (0 or anything)
值),然后按如下所示编写GetStaff()
方法:
public IEnumerable<SelectListItem> GetStaff()
{
List<SelectListItem> staffSelectListItems = _db.Staff.OrderBy(n => n.FirstName)
.Select(n => new SelectListItem
{
Value = n.StaffID.ToString(),
Text = n.FirstName.ToString() + " " + n.LastName.ToString()
}).ToList();
var defaultSelection = new SelectListItem()
{
Value = "0",
Text = "Select Staff Member",
Selected = true // <-- this is obligatory
};
staffSelectListItems.Insert(0, defaultSelection);
return staffSelectListItems;
}
然后在视图中:
@Html.DropDownListFor(x => Model.StaffId,(List<SelectListItem>)Model.Staff, htmlAttributes: new { @class = "form-control", id = "Country" })
希望它现在对您有用!
public IEnumerable<SelectListItem> GetStaff()
{
List <SelectListItem> selectListItems = _db.Staff.AsNoTracking()
.OrderBy(n => n.FirstName)
.Select(n =>
new SelectListItem
{
Value = n.StaffID.ToString(),
Text = n.FirstName.ToString() + " " + n.LastName.ToString()
}).ToList();
var stafftip = new SelectListItem()
{
Value = null,
Text = "--- select staff memeber---"
};
selectListItems.Insert(0, stafftip );
return new SelectList(selectListItems, "Value", "Text");
}
您试图将IQueryable分配给无法使用的列表。 我已删除了该行,并修复了您对选择列表的使用,因为不需要工作人员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.