我有一个ViewBag,它是我在控制器中创建的列表:
Listlistoflists = new List ();
然后它会填充一些字符串,例如:
listoflists.Add("java"); listoflists.Add("php"); listoflists.Add("C#");
将其添加到ViewBag:ViewBag.listoflists = listoflists;
我想在我的View中检查它是否包含特定的字符串:
@if(ViewBag.listoflists.contains("java") { // do html stuff }
但是在运行时我收到以下错误:
System.Collections.Generic.List不包含contains的定义
我做错了什么,或者如何查看列表中是否包含某些内容?
您可能需要强制转换为字符串列表:
@if (((IList)ViewBag.listoflists).Contains("java") { // do html stuff }
另请注意,该Contains
方法以大写字母开头C
.
因此,您可以看到在ASP.NET MVC中使用ViewBag是一个完整的垃圾,导致您的视图中非常难看的代码.因此,强烈建议使用视图模型,该视图模型将包含特定视图的所有必要信息,并且也是强类型的.
所以切掉这个ViewBag
垃圾并开始使用视图模型:
public class MyViewModel { public IListListOfLists { get; set; } }
您的控制器操作可以填充并传递给视图:
public ActionResult Index() { var model = new MyViewModel(); Listlistoflists = new List (); 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#语言结构(如转换和填充).视图用于显示标记.