我试图用MVC 5进行搜索,我得到了逻辑,但是我需要的是让返回3个不同列表对象的方法
我有MVC 5
中的视图模型public class SearchViewModel
{
public List<Article> ArticleSearch { get; set; }
public List<Albums> AlbumsSearch { get; set; }
public List<Blog> BlogSearch { get; set; }
public List<PDFModel> PDFSearch { get; set; }
}
在我的控制器中:
public ActionResult Index()
{
using (DBContext db = new DBContext())
{
string xyz = "f";
var Search = new SearchViewModel()
{
AlbumsSearch = helper.Search(db.Albums, xyz) <!-- Here i get error -->
};
return View(Search);
}
}
助手搜索:
public static IList Search(object obj,string SearchString)
{
using (DBContext db = new DBContext())
{
if (obj is Albums)
{
var AlbumSearch = db.Albums.Where(x => x.AlbumName.Contains(SearchString) ||
x.AlbbumSmallDesc.Contains(SearchString) || x.AlbumNameEnglish.Contains(SearchString)||
x.AlbbumSmallDescEnglish.Contains(SearchString)).ToList();
return AlbumSearch as List<Albums>;
}
else if(obj is Article)
{
var ArticleSearch = db.Article.Where(x => x.ArticleSubject.Contains(SearchString)||x.ArticleSubjectEnglish.Contains(SearchString)||
x.ArticleMessage.Contains(SearchString)||x.ArticleMessageEnglish.Contains(SearchString)).ToList();
return ArticleSearch;
}
else
{
return null;
}
}
}
我想制作一种返回列表以进行搜索
的方法我得到此错误:
无法将类型'System.Collections.ilist'转换为'System.Collections.generic.list&lt; Mohamedjibril.models.albums>'。存在明确的转换(您是否缺少演员?)
您可能应该对不同类使用不同的搜索功能。话虽如此,您可以使用一些黑客使用相同的搜索功能。定义一种扩展方法将List<T>
转换为List<object>
。然后只需从您的方法返回List<object>
即可。
public static class ListExtensions
{
public static List<Object> ToObjectList<T>(this List<T> list) where T : class
{
var objectList = new List<object>();
list.ForEach(t => objectList.Add(t));
return objectList;
}
}
List<object> Search(int i)
{
if (i == 0)
{
return new List<Album>().ToObjectList();
}
else
{
return new List<Article>().ToObjectList();
}
}
update
使用类似的扩展方法调用搜索时,您可以转换回去。
public static List<T> FromObjectList<T>(this List<object> list) where T : class
{
var result = new List<T>();
list.ForEach(t => result.Add(t as T));
return result;
}
List<Album> albums = Search(0).FromObjectList<Album>();
消息非常明确,您正在尝试将IList
转换为IList<T>
。您的方法返回前者,并且您的视图模型具有后者。
您的搜索方法没有任何优势。您有所有这些if语句。如果您需要30种不同的类型,您该怎么办,如果语句写30种不同?而是这样做:
public static IList<Album> SearchAlbums(string SearchString)
{
using (DBContext db = new DBContext())
{
var AlbumSearch = db.Albums.Where(x => x.AlbumName.Contains(SearchString) ||
x.AlbbumSmallDesc.Contains(SearchString) || x.AlbumNameEnglish.Contains(SearchString) ||
x.AlbbumSmallDescEnglish.Contains(SearchString)).ToList();
return AlbumSearch;
}
}
也为其他类型创建相同的方法。