实施网站搜索的最佳MVC实践

时间:2009-11-27 16:50:20

标签: asp.net-mvc

我的网站有PageContent,News,Events等,我有一个控制器可以处理搜索。

在那个控制器动作方法中,我想我做了一个var results = SearchClass.Search(searchstring)来保持逻辑不在控制器之外。

但是因为我正在返回不同的结果,因为我正在搜索新闻,事件等,我如何返回结果,因为它们是不同的模型。我是否使用ViewModel然后将其传递给视图? return View(SearchModel);

更新:我把它搞砸了,你怎么想:

public ActionResult Search(string criteria)
        {
            var x = WebsiteSearch.Search(criteria);
            return View(x);
        }

 public static class WebsiteSearch
    {
        public static SearchViewModel Search(string SearchCriteria)
        {
            return new SearchViewModel(SearchCriteria);

        }
    }

public class SearchViewModel
    {
        private string searchCriteria = String.Empty;

        public IEnumerable<News> NewsItems
        {
            get { return from s in News.All() where s.Description.Contains(searchCriteria) || s.Summary.Contains(searchCriteria) select s; }
        }

        public IEnumerable<Event> EventItems
        {
            get { return from s in Event.All() where s.Description.Contains(searchCriteria) || s.Summary.Contains(searchCriteria) select s; }
        }

        public SearchViewModel(string SearchCriteria)
        {
            searchCriteria = SearchCriteria;
        }

    }

2 个答案:

答案 0 :(得分:0)

您可以让所有PageContentNewsEvents类实现一个公共接口,然后返回一个可搜索项列表。在视图中,您可以迭代项目并将它们格式化为适当的部分。

答案 1 :(得分:0)

我打算用与达林相似的想法发表评论。创建一个可在任何可搜索的类模型成员上实现的接口。事实上,我建议使用两个不同的接口,一个用于搜索参数,另一个用于返回结果的“列表”。即沿着:

public interface ISearchParameters
{
    // quick and dirty - the 'key' 'COULD' be the db column
    // and the 'value' the search value for that column
    // as i said, quick and dirty for the purposes of demonstration
    IDictionary<string, string> SearchTokens { get; set; }
}

// return a 'list' of matching entries which when clicked, 
// will navigate to the url of the matching 'page'
public interface ISearchResults
{   
    string URLLink{ get; set; }
    string Description{ get; set; }
}

希望这至少会对这个主题产生一些想法......