asp.netasp.net-mvcrepository

ASP.NET MVC Search


I'm building a very simple search system using ASP.NET MVC. I had it originally work by doing all the logic inside the controller but I am now moving the code piece by piece into a repository. Can anyone help me do this.

Here is the original Action Result that was in the controller.

public ActionResult Index(String query)
        {
            var ArticleQuery = from m in _db.ArticleSet
                               select m;

            if (!string.IsNullOrEmpty(query))
            {
                ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query) orderby m.posted descending);
            }

            return View(ArticleQuery.ToList());
        }

As you can see, the Index method is used for both the initial list of articles and also for the search results (they use the same view).

In the new system the code in the controller is as follows:

public ActionResult Index()
    {
        return View(_repository.ListAll());
    }

The Repository has the following code:

public IList<Article> ListAll()
{
    var ArticleQuery = (from m in _db.ArticleSet

                        orderby m.posted descending select m);

    return ArticleQuery.ToList();
}

and the Interface has the following code:

public interface INewsRepository
{
    IList<Article> ListAll();
}

So what I need to do is now add in the search query stuff into the repository/controller methods using this new way. Can anyone help? Thanks.

EDIT: The INewsRespository file as it looks now:

namespace MySuperAwesomeApp.Models
{
    public interface INewsRepository
    {
        IList<Article> ListAll();

        //Article Details(int id);

        //Article Create([Bind(Exclude = "Id")]Article articleToCreate);
    }
}

Solution

  • Your interface INewsRepository needs to have the following added:

    IList<Article> Search(string query);
    

    Repository

    Then in the NewsRepository that implements INewsRepository:

    public IList<Article> INewsRespository.Search(string query)
    {
        var articleQuery = (from m in _db.ArticleSet
                            where m.headline.Contains(query)
                            orderby m.posted descending select m).ToList();
    }
    

    In the controller, you handle the case where the query doesn't contain information:

    Controller

    //just for this example. You should look at DI/IoC for Real World Usage.
    INewsRepository repository; 
    public ActionResult ListArticles(string query)
    {
        repository = new NewsRepository();
        List<Article> articles = new List<Article>();
        if (string.IsNullOrEmpty(query))
        {
            articles = repository.ListAll();
        }
        else 
        { 
            articles = repository.Search(query);
        }
        return View(articles);
    }