C# 为什么我选择的角色在每个选择中显示一个字母

C# 为什么我选择的角色在每个选择中显示一个字母,c#,asp.net-mvc,asp.net-identity-2,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")

我正在尝试更改用户登录或注销并希望注册时的注册表。这就是我所尝试的:

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");
}
它只显示一个选项,但显示方式如下。但是为什么呢


您使用的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 }
       }
    );
var name=\u context.Roles.First(x=>x.name==“注册用户”).name;
ViewBag.Name=新建选择列表(
新名单
{
新建SelectListItem{Text=name,Value=name}
}
);

您使用的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 }
       }
    );
var name=\u context.Roles.First(x=>x.name==“注册用户”).name;
ViewBag.Name=新建选择列表(
新名单
{
新建SelectListItem{Text=name,Value=name}
}
);

要获得想要的单个元素列表,请执行以下操作:

new SelectList(new[] { _context.Roles.First(x=> x.Name == "Registered Users").Name });
因为
SelectList
构造函数需要一个
IEnumerable
,即要显示的元素集合。由于字符串是字符的集合,因此它可以工作,但会将字符串视为要显示的元素集合(即单个字符)

还要注意,您的LINQ查询实际上没有意义。如果存在与条件匹配的元素,则结果将始终是
“注册用户”
。否则将引发异常。因此,您可以将其简化一点:

//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?

要拥有想要的单个元素列表,请执行以下操作:

new SelectList(new[] { _context.Roles.First(x=> x.Name == "Registered Users").Name });
因为
SelectList
构造函数需要一个
IEnumerable
,即要显示的元素集合。由于字符串是字符的集合,因此它可以工作,但会将字符串视为要显示的元素集合(即单个字符)

还要注意,您的LINQ查询实际上没有意义。如果存在与条件匹配的元素,则结果将始终是
“注册用户”
。否则将引发异常。因此,您可以将其简化一点:

//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?

我猜
SelectList
的构造函数需要一个集合,
string
基本上是
char
s的集合。尝试将
\u context.Roles…
内容包装到字符串数组初始值设定项(例如
新字符串[]{…}
)中,看看是否可以修复它。我猜
SelectList
的构造函数需要一个集合,
字符串
基本上是
字符的集合。尝试将
\u context.Roles…
内容包装在字符串数组初始值设定项(例如
新字符串[]{…}
)中,并查看这是否可以修复它。
新列表
是多余的,因此是噪声
new[]
更简洁,因此可读性更强(元素的类型可以清楚地看到)。@BartoszKP谢谢,这只是如何实现它的又一个示例。因为您已经用
new[]
:)
new List
描述了这个案例,所以它是多余的,因此是噪声
new[]
更简洁,因此可读性更强(元素的类型可以清楚地看到)。@BartoszKP谢谢,这只是如何实现它的又一个示例。因为您已经用
new[]
:)描述了该案例