Bazen yaptığımız web uygulamaları büyür büyür, dallanıp budaklanıp aradığınızı zor bulmanıza sebep olabilir. Böyle durumlarda sitenizde mini bir arama motoru olmasını isteyebilirsiniz. ASP.NET MVC 4 ile bunun nasıl yapılabileceğini göstermek istiyorum. Öncelikle uygulamanızda “MvcSiteProvider” nuGet paketini ekliyoruz.
Arama Sonuçlarını Göstermek İhtiyacımız olan ViewModel :
public class SearchResults
{
public string Title { get ; set ; }
public string ControllerName { get ; set ; }
public string Description { get ; set ; }
}
HomeController’ımıza Arama Yapacak Action’ı ekliyoruz:
public ActionResult SearchResults ( string searchString )
{
if (! String . IsNullOrEmpty ( searchString ))
{
ViewBag . CurrentFilter = searchString ;
SiteMapPathHelperModel mdl = new SiteMapPathHelperModel ();
SiteMapNode startingNode = SiteMap . Provider . RootNode ;
for ( SiteMapNode node = startingNode ; node != null ; node = node . ParentNode
{
MvcSiteMapProvider . MvcSiteMapNode mvcNode = node as MvcSiteMapProvider . MvcSiteMapNode ;
if ( mvcNode != null )
foreach ( var cnode in mvcNode . GetAllNodes ())
{
mdl . Nodes . Add ( new SiteMapNodeModel {
Title = (( MvcSiteMapProvider . MvcSiteMapNode ) cnode ). Title ,
Controller = (( MvcSiteMapProvider . MvcSiteMapNode ) cnode ). Controller ,
Description = (( MvcSiteMapProvider . MvcSiteMapNode ) cnode ). Description ,
Action = (( MvcSiteMapProvider . MvcSiteMapNode ) cnode ). Action
});
}
}
IEnumerable < searchresults > result = ( from page in mdl . Nodes where ( page . Controller . ToUpper (). Contains ( searchString . ToUpper ())
|| page . Title . ToUpper (). Contains ( searchString . ToUpper ())
|| page . Description . ToUpper (). Contains ( searchString . ToUpper ()))
&& page . Action == "Index"
select new SearchResults
{
Title = page . Title ,
ControllerName = page . Controller ,
Description = page . Description
});
return View ( result );
}
return View ();
}
Kodumuz mvc.sitemap dosyamızda Controller, Title ve Description alanlarında arama bilgimizin olup olmadığını kontrol ediyor.
View oluşturduğumuzda şöyle bir kod basitçe işimizi görecektir.
@model IEnumerable<viewmodels . searchresults >
@{
ViewBag.Title = “SearchResults”;
}
<h2> Search Results</h2>
<style>
.highlight {
font-weight : bold ;
}
</style>
<script type= "text/javascript" >
$ ( document ). ready ( function () {
$ ( ".portfolio-block" ). highlight ( "@ViewBag.CurrentFilter" );
});
</script>
<div class= "row-fluid search-forms search-default" >
<form class= "form-search" method= "get" >
<div class= "chat-form" >
<div class= "input-cont" >
<input name= "searchString" type= "text" value= "@ViewBag.CurrentFilter" placeholder= "Search…/" />
</div>
<button class= "btn green" type= "submit" >
Search <i class= "m-icon-swapright m-icon-white" ></i></button>
</div>
</form>
@if(Model!=null)
{
foreach(var result in Model)
{
<div class= "row-fluid portfolio-block" >
<h4> @Html.ActionLink(result.Title, "Index", result.ControllerName)</h4>
<a href= "/@result.ControllerName/Index" > /@result.ControllerName</a>
<p> @result.Description</p>
}
}
else
{
<div class= "row-fluid portfolio-block" >
No results found.
</div>
}
Eğer kodumuza JQuery Highlight plugin i yüklemişsek arama sonuçlarında arama kelimelerini belirginleştirebiliriz.
Örnek mvc.sitemap dosyası:
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns= "http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0"
xsi:schemaLocation= "http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd" enableLocalization= "true" >
<mvcSiteMapNode title= "Users" controller= "User" action= "Index" description= "Managament page of users and their role." >
<mvcSiteMapNode title= "Create User" controller= "User" action= "Create" />
<mvcSiteMapNode title= "Edit User" controller= "User" action= "Edit" />
<mvcSiteMapNode title= "Delete User" controller= "User" action= "Delete" />
<mvcSiteMapNode title= "User Details" controller= "User" action= "Details" />
<mvcSiteMapNode title= "User Roles" controller= "Role" action= "Index" description= "Define role names for site usage." >
<mvcSiteMapNode title= "Create Role" controller= "Role" action= "Create" />
<mvcSiteMapNode title= "Edit User Role" controller= “Role" action= “Edit" />
<mvcSiteMapNode title= "Delete User Role" controller= “Role" action= “Delete" />
<mvcSiteMapNode title= "User Role Details" controller= “Role" action= “Details" />
Arama sorgumuz basitçe mvc.sitemap dosyasındaki bütün nodları tarar ancak ben örnekte sadece Action=”Index” olarak filtreledim. Siz LINQ sorgusunu kullanarak daha da geliştirebilirsiniz.