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

How to check if a List in a ViewBag contains string

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

 List<string> listoflists = new List<string>();

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

listoflists.Add("java");
listoflists.Add("php");
listoflists.Add("C#");

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

然后我想检查我的视图是否包含特定字符串:

@if(ViewBag.listoflists.contains("java")
{
// do html stuff
}

但是当 运行 这时我得到以下错误:

System.Collections.Generic.List 不包含 contains

的定义

我做错了什么,或者我应该如何检查列表是否包含视图中的内容?

您可能需要转换回字符串列表:

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

另请注意,Contains 方法以大写 C 开头。

正如您在 ASP.NET 中使用 ViewBag 所看到的那样,MVC 完全是垃圾,导致您的视图中的代码非常丑陋。出于这个原因,强烈建议使用包含特定视图的所有必要信息并且也是强类型的视图模型。

所以停止这个ViewBag废话并开始使用视图模型:

public class MyViewModel
{
    public IList<string> ListOfLists { get; set; }
}

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

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

现在您可以拥有此模型的强类型视图,这将允许您避免之前的转换:

@model MyViewModel

@if (Model.ListOfLists.Contains("java"))
{
    // do html stuff
}

所以基本上每次您在 ASP.NET MVC 应用程序中使用 ViewBag/ViewData 时,您的脑海中都会立即响起警报,告诉您:伙计,到底是怎么回事,您做错了。只需使用视图模型,以避免将您的视图转换为完全不相关的 C# 语言结构(如转换和其他内容)的可恶混乱。视图用于显示标记。

ViewBag是一个动态类型,它在编译时并不知道你定义的key ViewBag.listoflists中包含的实际类型是什么,你需要将它转换为特定的类型然后你可以在上面调用那些方法:

@{

List<string> languages= ViewBag.listoflists as List<string>;
}
@if(languages.contains("java")
{
// do html stuff
}