如何检查ViewBag中的List是否包含字符串

Ste*_*ler 0 c# collections asp.net-mvc contains

我有一个ViewBag,它是我在控制器中创建的列表:

 List<string> listoflists = new List<string>();
Run Code Online (Sandbox Code Playgroud)

然后它会填充一些字符串,例如:

listoflists.Add("java");
listoflists.Add("php");
listoflists.Add("C#");
Run Code Online (Sandbox Code Playgroud)

将其添加到ViewBag:ViewBag.listoflists = listoflists;

我想在我的View中检查它是否包含特定的字符串:

@if(ViewBag.listoflists.contains("java")
{
// do html stuff
}
Run Code Online (Sandbox Code Playgroud)

但是在运行时我收到以下错误:

System.Collections.Generic.List不包含contains的定义

我做错了什么,或者如何查看列表中是否包含某些内容?

Dar*_*rov 8

您可能需要强制转换为字符串列表:

@if (((IList<string>)ViewBag.listoflists).Contains("java")
{
    // do html stuff
}
Run Code Online (Sandbox Code Playgroud)

另请注意,该Contains方法以大写字母开头C.

因此,您可以看到在ASP.NET MVC中使用ViewBag是一个完整的垃圾,导致您的视图中非常难看的代码.因此,强烈建议使用视图模型,该视图模型将包含特定视图的所有必要信息,并且也是强类型的.

所以切掉这个ViewBag垃圾并开始使用视图模型:

public class MyViewModel
{
    public IList<string> ListOfLists { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您的控制器操作可以填充并传递给视图:

public ActionResult Index()
{
    var model = new MyViewModel();
    List<string> listoflists = new List<string>();
    listoflists.Add("java");
    listoflists.Add("php");
    listoflists.Add("C#");
    model.ListOfLists = listoflists;
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

现在你可以对这个模型有一个强类型视图,这将允许你避免以前的转换:

@model MyViewModel

@if (Model.ListOfLists.Contains("java"))
{
    // do html stuff
}
Run Code Online (Sandbox Code Playgroud)

所以基本上每次在ASP.NET MVC应用程序中使用ViewBag/ViewData时,警报都会立即响起,告诉你:伙计,你到底做错了什么.只需使用视图模型,以避免将您的视图转换为完全无关的C#语言结构(如转换和填充).视图用于显示标记.