为什么我选择的角色每个选项显示一个字母

时间:2017-01-19 21:55:09

标签: c# asp.net-mvc asp.net-identity-2

我正在尝试更改用户登录或注销时想要注册的注册表单。这就是我试过的:

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

它只显示一个选项,但它会像这样显示。但为什么呢?

enter image description here

2 个答案:

答案 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?