-2

Below is the Action Method Index of my Home Controller that fetch the data from SQL Server database view named AllMovies.

using Skylink.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PagedList;


namespace Skylink.Controllers
{
    public class HomeController : Controller
        {
    public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
    {
        ViewBag.CurrentSort = sortOrder;
        ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
        ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        ViewBag.CurrentFilter = searchString;

        MovieContext movieContext = new MovieContext();
        var movies = from m in movieContext.Movies1.ToList()
                         select m;

        if (!String.IsNullOrEmpty(searchString))
        {
            movies = movies.Where(s => s.Title.Contains(searchString)
                                   || s.Title.Contains(searchString));
        }

        switch (sortOrder)
        {
            case "name_desc":
                movies = movies.OrderByDescending(s => s.Title);
                break;
            case "date":
                movies = movies.OrderBy(s => s.Print);
                break;
            default:
                movies = movies.OrderByDescending(s => s.DateAdd);
                break;

        }

        int pageSize = 24;
        int pageNumber = (page ?? 1);
        return View(movies.ToPagedList(pageNumber, pageSize));

    }    

And below is the cshtml of the Index view (Razor) that the above action result returns.

@using Skylink.Models;

@model PagedList.IPagedList<Skylink.Models.Movie1>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />

@{ViewBag.Title = "Recently Added";
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/StyleSheet4.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")"></script>
</head>
<body>

<div>
    <br />
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of    @Model.PageCount

    @Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
</div>

@using (Html.BeginForm("Index", "Home", FormMethod.Get))

{
    <p>
    Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
    <input type="submit" value="Search" />
</p>
}

    @foreach (var item in Model)
{
    <div class="img">

        <a href="@Url.Action("Details","Home", new { id = item.Id })"><img src="@Url.Content(@item.ImageUrl)" alt="Image Not Available" /></a>
        <div class="desc" style="font-family:Arial;font-size:x-small;  color:white">@Html.DisplayFor(model => item.Title)</div>
        <div class="desc" style="font-family:Arial;font-size:xx-small; color:yellow">IMDB: @Html.DisplayFor(model => item.Rating)</div>
        <div class="desc" style="font-family:Arial;font-size:xx-small; color:white">@Html.DisplayFor(model => item.Print)</div>
        </div>

}
</body>
</html>

Everything is working fine but the search string at runtime didn't match the case for example I have a movie name "Ted" but when I type "ted" in search textbox I get no results. I have to type exactly "Ted" to find the movie. All I need is to type "ted" and get the result.

Hope I explained my Question in detail.

Khurram
  • 31
  • 1
  • 5

1 Answers1

3

Why not use ToLower for your comparisons?

switch (sortOrder.ToLower()) {
    case "name_desc":
        movies =  movies.OrderByDescending(s => s.Title);
        break;
    case "date":
        movies = movies.OrderBy(s => s.Print);
        break;
    default:
        movies = movies.OrderByDescending(s => s.DateAdd);
        break;
}

Alternatively, you can use:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);

BTW, using == for string equality assessments is bad. It's checking for reference equality, not lexical equality. You need to use Equals. See this answer for why.

Edit since OP clarified the question... if this is the line you're having issues with:

if (!String.IsNullOrEmpty(searchString))
{
    movies = movies.Where(s => s.Title.Contains(searchString)
                           || s.Title.Contains(searchString));
}

(btw, that || clause is checking the same condition twice!!) ...here's the suggested fix:

if (!String.IsNullOrEmpty(searchString))
{
    movies = movies.Where(s => s.Title.IndexOf(searchString, 
        StringComparison.CurrentCultureIgnoreCase) != -1);
}
Community
  • 1
  • 1
TayTay
  • 6,882
  • 4
  • 44
  • 65