سلام به شما دوستان عزیز حال شماخوبه ؟ امیدوارم که خوب وسلامت باشی.در این قسمت از مقاله ی آموزشی MVC، نحوه ی افزودن قابلیت Search به متد Index را برای جستجوی movie ها بر اساس ژانر و اسم آن فیلم، شرح خواهیم داد.
بروز رسانی فرم Index
متد Index موجود در کلاس MoviesController را به صورت زیر ویرایش کنید:
public ActionResult Index(string searchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
اولین خط متد Index، برای انتخاب movie ها یک LINQ query ایجاد می کند:
var movies = from m in db.Movies
select m;
}
Query در این برهه از زمان تعریف شده، اما هنوز بر روی پایگاه داده اجرا نشده است.
چنانچه پارامتر searchString دربردارنده ی یک رشته باشد، کوئری movie به گونه ای اصلاح می شود که مقدار search string با استفاده از کد زیر فیلتر شود:
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
قسمت s => s.Title کد بالا، یک عبارت Lambda است. عبارت های Lambda در LINQ query های مبتنی بر متد، به عنوان آرگومان برای متدهای query operator (مانند تابع where که در مثال فوق بکار گرفته شده) استفاده می شوند. LINQ query ها به محض تعریف شدن یا در زمانی که به واسطه ی فراخوانی یک متد همانند Where یا OrderBy مورد دستکاری قرار می گیرند ، اجرا نمی شود. بلکه اجرای query به تعویق می افتد، بدین معنا که ارزیابی عبارت تا زمانی که متد ToList فراخوانی نشده یا مقدار داخل حلقه نیافتاده و تکرار نشده به تاخیر افتاده و صورت نمی گیرد. در نمونه ی Search، query در Index.cshtml view اجرا می شود.
توجه: متد Contains روی پایگاه داده اجرا شده، نه بر روی کد c# مثال بالا. در پایگاه داده، متد نام برده به SQL LIKE که به کوچک و بزرگی حروف حساس است، نگاشت می شود.
اکنون شما می توانید Index view را که فرم را به کاربر نمایش می دهد، بروز رسانی کنید.
برنامه را اجرا کرده و به /Movies/Index پیمایش کنید. یک query string مانند این نمونه ?searchString=ghost به URL ضمیمه کنید. Movie های فیلتر شده نمایش داده می شوند.
اگر پارامتر ورودی متد Index را متغیری به نام id تغییر دهیم، پارامتر id با placeholder {id} برای مسیرهای تنظیم شده در فایل App_Start\RouteConfig.cs منطبق (match) می شود.
{controller}/{action}/{id}
متد Index اصلاح نشده:
public ActionResult Index(string searchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
متد Index اصلاح شده:
public ActionResult Index(string id)
{
string searchString = id;
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
حال می توانید search title را بجای اینکه به عنوان مقدار query string ارسال کنید، آن را به صورت route data (یک بخش از URL) پاس دهید.
clip_image004[4]
اما شما نمی توانید انتظار داشته باشید که کاربران هر بار برای جستجو به دنبال یک فیلم، URL را تغییر دهند. بنابراین شما با افزودن UI به کاربر کمک می کنید فیلم ها را فیلتر کند. اگر ورودی متد Index را برای تست اینکه پارامتر ID، route-bound چگونه ارسال می شود، تغییر داده اید، بایستی آن را به حالت قبلی برگردانید تا متد Index یک پارامتر به نام searchString بپذیرد:
public ActionResult Index(string searchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
فایل Views\Movies\Index.cshtml را باز کرده و درست بعد از Views\Movies\Index.cshtml، form markup رنگی شده ی زیر را اضافه کنید:
@model IEnumerable
@{
ViewBag.Title = “Index”;
}
Index
@Html.ActionLink(“Create New”, “Create”)
@using (Html.BeginForm())
{
Title: @Html.TextBox(“SearchString”)
}
Html.BeginForm یک تگ باز