我正在尝试更改用户登录或注销时想要注册的注册表单。这就是我试过的:
if (!Request.IsAuthenticated)
{
ViewBag.Name = new SelectList(_context.Roles.First(x=> x.Name == "Registered Users").Name);
}
else
{
ViewBag.Name = new SelectList(_context.Roles.ToList(), "Name", "Name");
}
它只显示一个选项,但它会像这样显示。但为什么呢?
答案 0 :(得分:3)
您使用的SelectList的构造函数是
SelectList(IEnumerable)
通过使用列表的指定项来初始化SelectList类的新实例。
您将字符串作为参数传递,因此它将识别为字符集合,并且每个选项将显示一个字母
您可以尝试使用:
var name = _context.Roles.First(x=> x.Name == "Registered Users").Name;
ViewBag.Name = new SelectList(
new List<SelectListItem>
{
new SelectListItem {Text = name , Value = name }
}
);
答案 1 :(得分:1)
要拥有您想拥有的单元素列表:
new SelectList(new[] { _context.Roles.First(x=> x.Name == "Registered Users").Name });
因为SelectList
构造函数需要IEnumerable
,即要显示的元素集合。由于string是一个字符集合,因此它可以工作,但会将您的字符串视为要显示的元素集合(即单个字符)。
另请注意,您的LINQ查询确实没有意义。如果存在与条件匹配的元素,则结果将始终为"Registered Users"
。否则将抛出异常。所以,你可以简化一下:
//a class field perhaps?
private readonly string RegisteredUsersString = "Registered Users";
//...
if (_context.Roles.Any(x => x.Name == RegisteredUsersString))
ViewBag.Name = new SelectList(new[] { RegisteredUsersString });
else
// throw? display an error?