{"id":82935,"date":"2024-11-08T01:23:38","date_gmt":"2024-11-07T21:53:38","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/"},"modified":"2024-11-08T01:23:38","modified_gmt":"2024-11-07T21:53:38","slug":"aspnet8-using-datatablesnet-part9-advanced-filters-4m5m","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/","title":{"rendered":"ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part9 \u2013 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0639\u0645\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a jQuery DataTables.net \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Asp.Net 8 MVC.<\/p>\n<p>\u0686\u06a9\u06cc\u062f\u0647: \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0639\u0645\u0644\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Asp.Net 8 MVC \u06a9\u0647 \u0627\u0632 \u0645\u0648\u0644\u0641\u0647 jQuery DataTables.net \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0627\u062f\u0627\u0645\u0647 \u0645\u0642\u0627\u0644\u0647 Part8 \u0627\u0633\u062a.<\/p>\n<p>  1 ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 jQuery DataTables.net<\/p>\n<p>\u0645\u0646 \u0645\u0648\u0644\u0641\u0647 jQuery DataTables.net \u0631\u0627 \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0631\u062f\u0645 [1] \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627\u06cc ASP.NET8 \u0648 \u0627\u06cc\u062c\u0627\u062f \u0686\u0646\u062f\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0646\u0645\u0648\u0646\u0647 \u0627\u0648\u0644\u06cc\u0647 (\u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645).  \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0627\u062a \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>  1.1 \u0645\u0642\u0627\u0644\u0627\u062a \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647<\/p>\n<p>\u0645\u0642\u0627\u0644\u0627\u062a \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<p>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part1 \u2013 Foundation<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u06a9\u0645\u0647 \u0647\u0627\u06cc DataTables.net \u2013 Part2 \u2013 Action<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part3 \u2013 \u062d\u0627\u0644\u062a \u0630\u062e\u06cc\u0631\u0647<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part4 \u2013 Multilingual<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part5 \u2013 \u0627\u0631\u0633\u0627\u0644 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u062f\u0631 AJAX<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part6 \u2013 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u062f\u0631 AJAX<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part7 \u2013 \u062f\u06a9\u0645\u0647 \u0647\u0627\u06cc \u0645\u0646\u0638\u0645<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part8 \u2013 \u0633\u0637\u0631\u0647\u0627 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f<br \/>\nASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part9 \u2013 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<\/p>\n<p>  2 \u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc<\/p>\n<p>\u0647\u062f\u0641 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0624\u0644\u0641\u0647 DataTables.net \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc. \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0646\u062a\u06cc\u062c\u0647 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644\u060c \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0645\u0624\u0644\u0641\u0647 DataTables.net \u0631\u0627 \u062f\u0631 \u06af\u0648\u0634\u0647 \u0628\u0627\u0644\u0627 \u0633\u0645\u062a \u0631\u0627\u0633\u062a \u063a\u06cc\u0631\u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u06cc\u0645 \u0648 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645. \u0641\u0631\u0645 \u0633\u0641\u0627\u0631\u0634\u06cc \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647. \u06a9\u0627\u062f\u0631 \u0641\u06cc\u0644\u062a\u0631 (\u062c\u0633\u062a\u062c\u0648) \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0633\u0627\u062f\u0647 \u0628\u0648\u062f \u0648 \u0645\u0642\u062f\u0627\u0631 \u06cc\u06a9\u0633\u0627\u0646\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0633\u062a\u0648\u0646 \u0647\u0627 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0631\u062f. \u0627\u063a\u0644\u0628 \u062f\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0647\u0627\u06cc \u062d\u0631\u0641\u0647 \u0627\u06cc\u060c \u0641\u0631\u062f \u0628\u0647 \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u0641\u06cc\u0644\u062a\u0631\u06cc\u0646\u06af \u062f\u0642\u06cc\u0642 \u062a\u0631\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f.<\/p>\n<p>\u0645\u0646 \u0628\u0627 \u062f\u0642\u062a \u0628\u0647 \u0633\u0627\u06cc\u062a \u0646\u06af\u0627\u0647 \u06a9\u0631\u062f\u0645 [1] \u062f\u0631 \u062a\u0645\u0627\u0645 \u0627\u0641\u0632\u0648\u0646\u0647\u200c\u0647\u0627 \u0648 \u0627\u0641\u0632\u0648\u0646\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0624\u0644\u0641\u0647 DataTables.net \u0628\u0631\u0627\u06cc \u0641\u06cc\u0644\u062a\u0631 \u06a9\u0631\u062f\u0646 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u0645\u0627 \u0645\u0646 \u0686\u06cc\u0632\u06cc \u0631\u0627 \u06a9\u0647 \u0622\u0646\u062c\u0627 \u0628\u0648\u062f \u062f\u0648\u0633\u062a \u0646\u062f\u0627\u0634\u062a\u0645\u060c \u0647\u06cc\u0686 \u0686\u06cc\u0632 \u0628\u0647 \u0627\u0646\u062f\u0627\u0632\u0647 \u06a9\u0627\u0641\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u0645 \u062d\u0631\u0641\u0647 \u0627\u06cc \u0646\u0628\u0648\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0645\u0642\u062f\u0627\u0631\u06cc \u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc \u062f\u0631 ASP.NET \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645 \u0648 \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0645 \u0648 \u062c\u0632\u0621 DataTables.net \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u062c\u062f\u0648\u0644 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u06a9\u0646\u0645. \u0631\u0627\u0647 \u062d\u0644 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0647\u0645\u0627\u0646 \u0686\u06cc\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0628\u0647 \u0622\u0646 \u0631\u0633\u06cc\u062f\u0645.<\/p>\n<p>  3 \u0641\u0631\u0645 \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<\/p>\n<p>\u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0641\u0642\u0637 \u06cc\u06a9 \u0641\u0631\u0645 \u062f\u06cc\u06af\u0631 ASP.NET \u0627\u0633\u062a \u0648 \u0645\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u062d\u0627\u0644\u062a \u0641\u06cc\u0644\u062a\u0631 \u0631\u0627 \u062f\u0631 \u0634\u06cc\u0621 ASP.NET Session \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0628\u0647 \u0637\u0648\u0631\u06cc \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0631 \u0637\u0648\u0644 \u0647\u0631 \u062a\u0645\u0627\u0633 AJAX \u0628\u0631\u0627\u06cc \u0645\u0624\u0644\u0641\u0647 DataTables \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f. \u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628 &#8220;\u0648\u0636\u0639\u06cc\u062a \u0641\u06cc\u0644\u062a\u0631&#8221; \u0628\u06cc\u0646 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \/ \u0641\u0631\u0645 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646\u0645 \u06a9\u062f \u0645\u0631\u0628\u0648\u0637\u0647<\/p>\n<p>\/\/HomeController.cs ======================================<\/p>\n<p>public class HomeController : Controller<br \/>\n{<br \/>\npublic const string EMPLOYEES_ADVANCED_FILTER_STATE = &#8220;EMPLOYEES_ADVANCED_FILTER_STATE&#8221;;<\/p>\n<p>public IActionResult EmployeesAdvancedFilter(EmployeesAdvancedFilterVM model)<br \/>\n{<br \/>\n    try<br \/>\n    {<br \/>\n        ISession ? CurrentSession=this.HttpContext?.Session;<\/p>\n<p>        if (model.IsSubmit)<br \/>\n        {<br \/>\n            \/\/we have submit<br \/>\n            \/\/we save the advanced-filter state to session<br \/>\n            if (CurrentSession != null &amp;&amp; model != null)<br \/>\n            {<br \/>\n                model.FirstName=model.FirstName?.Trim();<br \/>\n                model.LastName = model.LastName?.Trim();<br \/>\n                model.City = model.City?.Trim();<br \/>\n                model.Country = model.Country?.Trim();<br \/>\n                string jsonUserEmployeesAdvancedFilterState = JsonSerializer.Serialize(model);<br \/>\n                CurrentSession.SetString(EMPLOYEES_ADVANCED_FILTER_STATE, jsonUserEmployeesAdvancedFilterState);<br \/>\n            }<\/p>\n<p>            return RedirectToAction(&#8220;Employees&#8221;, &#8220;Home&#8221;);<br \/>\n        }<br \/>\n        else if (model.IsReset)<br \/>\n        {<br \/>\n            \/\/we have reset<br \/>\n            \/\/we clear advanced-filter state in session<br \/>\n            CurrentSession?.Remove(EMPLOYEES_ADVANCED_FILTER_STATE);<br \/>\n        }<\/p>\n<p>        \/\/go for presentation<br \/>\n        {<br \/>\n            \/\/we get advanced-filter state from session if there is one<br \/>\n            string? jsonUserEmployeesAdvancedFilterState = CurrentSession?.GetString(EMPLOYEES_ADVANCED_FILTER_STATE);<\/p>\n<p>            if (!string.IsNullOrEmpty(jsonUserEmployeesAdvancedFilterState))<br \/>\n            {<br \/>\n                model = JsonSerializer.Deserialize&lt;EmployeesAdvancedFilterVM&gt;(jsonUserEmployeesAdvancedFilterState)<br \/>\n                    ?? new EmployeesAdvancedFilterVM();<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n    catch (Exception ex)<br \/>\n    {<br \/>\n        Console.WriteLine(ex.ToString());<br \/>\n    }<\/p>\n<p>    return View(model);<br \/>\n}<\/p>\n<p>\/\/EmployeesAdvancedFilterVM.cs<br \/>\nnamespace Example09.Models.Home<br \/>\n{<br \/>\n    public class EmployeesAdvancedFilterVM<br \/>\n    {<br \/>\n        \/\/model<br \/>\n        public string? FirstName { get; set; } = null;<br \/>\n        public string? LastName { get; set; } = null;<br \/>\n        public string? City { get; set; } = null;<br \/>\n        public string? Country { get; set; } = null;<br \/>\n        public bool IsSubmit { get; set; } = false;<br \/>\n        public bool IsReset { get; set; } = false;<\/p>\n<p>        \/\/view model<br \/>\n    }<br \/>\n}<\/p>\n<p>&lt;!&#8211; EmployeesAdvancedFilter.cshtml &#8211;&gt;<br \/>\n@using Example09.Models.Home;<\/p>\n<p>@model EmployeesAdvancedFilterVM<\/p>\n<p>@{<br \/>\n    &lt;div class=&#8221;text-center&#8221;&gt;<br \/>\n        &lt;h3 class=&#8221;display-4&#8243;&gt;Employees Advanced Filter&lt;\/h3&gt;<br \/>\n    &lt;\/div&gt;<\/p>\n<p>    &lt;fieldset class=&#8221;border rounded-3 p-3&#8243; style=&#8221;width:600px&#8221;&gt;<br \/>\n        &lt;legend class=&#8221;float-none w-auto px-3&#8243;&gt;Choose filter parameters&lt;\/legend&gt;<\/p>\n<p>        &lt;p class=&#8221;bg-light m-1 border p-1&#8243;&gt;<br \/>\n        * = whildchar, zero or more characters &lt;br\/&gt;<br \/>\n        ? = whildchar, one character<br \/>\n        &lt;\/p&gt;<\/p>\n<p>        &lt;form id=&#8221;form1&#8243; method=&#8221;post&#8221;&gt;                  <\/p>\n<p>            &lt;div class=&#8221;form-group&#8221;&gt;<br \/>\n                &lt;label asp-for=FirstName&gt;Given Name&lt;\/label&gt;<br \/>\n                &lt;input class=&#8221;form-control&#8221; asp-for=&#8221;FirstName&#8221; \/&gt;<br \/>\n            &lt;\/div&gt;<\/p>\n<p>            &lt;div class=&#8221;form-group&#8221;&gt;<br \/>\n                &lt;label asp-for=LastName&gt;Family Name&lt;\/label&gt;<br \/>\n                &lt;input class=&#8221;form-control&#8221; asp-for=&#8221;LastName&#8221; \/&gt;<br \/>\n            &lt;\/div&gt;<\/p>\n<p>            &lt;div class=&#8221;form-group&#8221;&gt;<br \/>\n                &lt;label asp-for=City&gt;Town&lt;\/label&gt;<br \/>\n                &lt;input class=&#8221;form-control&#8221; asp-for=&#8221;City&#8221; \/&gt;<br \/>\n            &lt;\/div&gt;<\/p>\n<p>            &lt;div class=&#8221;form-group&#8221;&gt;<br \/>\n                &lt;label asp-for=Country&gt;&lt;\/label&gt;<br \/>\n                &lt;input class=&#8221;form-control&#8221; asp-for=&#8221;Country&#8221; \/&gt;<br \/>\n            &lt;\/div&gt;<\/p>\n<p>            &lt;button type=&#8221;submit&#8221; form=&#8221;form1&#8243; class=&#8221;btn btn-primary mt-3 ms-3 float-end&#8221; asp-area=&#8221;&#8221;<br \/>\n                asp-controller=&#8221;Home&#8221; asp-action=&#8221;EmployeesAdvancedFilter&#8221; asp-route-IsSubmit=&#8221;true&#8221;&gt;<br \/>\n                Submit<br \/>\n            &lt;\/button&gt;<\/p>\n<p>            &lt;a class=&#8221;btn btn-primary mt-3 float-end&#8221; asp-area=&#8221;&#8221;<br \/>\n                    asp-controller=&#8221;Home&#8221; asp-action=&#8221;EmployeesAdvancedFilter&#8221; asp-route-IsReset=&#8221;true&#8221;&gt;<br \/>\n                Reset<br \/>\n            &lt;\/a&gt;<br \/>\n        &lt;\/form&gt;<br \/>\n    &lt;\/fieldset&gt;<br \/>\n}<\/p>\n<p>  4 \u062c\u0632\u0621 DataTables.net \u0633\u0645\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0646 \u0641\u0642\u0637 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0646\u0645\u0627\u06cc ASP.NET \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0624\u0644\u0641\u0647 DataTables \u0686\u06af\u0648\u0646\u0647 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f.<\/p>\n<p>&lt;!&#8211; Employees.cshtml &#8211;&gt;<br \/>\n@using Example09.Models.Home;<\/p>\n<p>@model EmployeesVM<\/p>\n<p>&lt;partial name=&#8221;_LoadingDatatablesJsAndCss&#8221; \/&gt;<\/p>\n<p>@{<br \/>\n    &lt;div class=&#8221;text-center&#8221;&gt;<br \/>\n        &lt;h3 class=&#8221;display-4&#8243;&gt;Employees table &#8211; Advanced Filter&lt;\/h3&gt;<br \/>\n    &lt;\/div&gt;<\/p>\n<p>    &lt;h4 class=&#8221;bg-info m-4 border p-3&#8243;&gt;<br \/>\n        @{<br \/>\n            string text1 = &#8220;Filter= &#8221; + Model?.AdvancedFilterState;<br \/>\n            @text1<br \/>\n        }<br \/>\n    &lt;\/h4&gt;<\/p>\n<p>    &lt;!&#8211; Here is our table HTML element defined. JavaScript library Datatables<br \/>\n    will do all the magic to turn it into interactive component &#8211;&gt;<br \/>\n    &lt;table id=&#8221;EmployeesTable01&#8243; class=&#8221;table table-striped table-bordered &#8220;&gt;<br \/>\n    &lt;\/table&gt;<br \/>\n}<\/p>\n<p>&lt;script type=&#8221;text\/javascript&#8221;&gt;<br \/>\n    \/\/ Datatables script initialization =========================================<br \/>\n    \/\/ we used defer attribute on jQuery so it might not be available at this point<br \/>\n    \/\/ so we go for vanilla JS event<\/p>\n<p>    document.addEventListener(&#8220;DOMContentLoaded&#8221;, InitializeDatatable);<\/p>\n<p>    function InitializeDatatable() {<br \/>\n        $(&#8220;#EmployeesTable01&#8221;).dataTable(<br \/>\n            \/\/providing initialization parameters as JavaScript object<br \/>\n            {<br \/>\n                \/\/processing-Feature control the processing indicator.<br \/>\n                processing: true,<br \/>\n                \/\/paging-Enable or disable table pagination.<br \/>\n                paging: true,<br \/>\n                \/\/info-Feature control table information display field<br \/>\n                info: true,<br \/>\n                \/\/ordering-Feature control ordering (sorting) abilities in DataTables.<br \/>\n                ordering: true,<br \/>\n                \/\/searching-Feature control search (filtering) abilities<br \/>\n                searching: false,<\/p>\n<p>                \/\/autoWidth-Feature control DataTables&#8217; smart column width handling.<br \/>\n                autoWidth: true,<br \/>\n                \/\/lengthMenu-Change the options in the page length select list.<br \/>\n                lengthMenu: [10, 15, 25, 50, 100],<br \/>\n                \/\/pageLength-Change the initial page length (number of rows per page)<br \/>\n                pageLength: 10,<\/p>\n<p>                \/\/order-Initial order (sort) to apply to the table.<br \/>\n                order: [[1, &#8216;asc&#8217;]],<\/p>\n<p>                \/\/serverSide-Feature control DataTables&#8217; server-side processing mode.<br \/>\n                serverSide: true,<\/p>\n<p>                \/\/Load data for the table&#8217;s content from an Ajax source.<br \/>\n                ajax: {<br \/>\n                    &#8220;url&#8221;: &#8220;@Url.Action(&#8220;EmployeesDT&#8221;, &#8220;Home&#8221;)&#8221;,<br \/>\n                    &#8220;type&#8221;: &#8220;POST&#8221;,<br \/>\n                    &#8220;datatype&#8221;: &#8220;json&#8221;<br \/>\n                },<\/p>\n<p>                \/\/Set column specific initialisation properties.<br \/>\n                columns: [<br \/>\n                    \/\/name-Set a descriptive name for a column<br \/>\n                    \/\/data-Set the data source for the column from the rows data object \/ array<br \/>\n                    \/\/title-Set the column title<br \/>\n                    \/\/orderable-Enable or disable ordering on this column<br \/>\n                    \/\/searchable-Enable or disable search on the data in this column<br \/>\n                    \/\/type-Set the column type &#8211; used for filtering and sorting string processing<br \/>\n                    \/\/visible-Enable or disable the display of this column.<br \/>\n                    \/\/width-Column width assignment.<br \/>\n                    \/\/render-Render (process) the data for use in the table.<br \/>\n                    \/\/className-Class to assign to each cell in the column.<\/p>\n<p>                    {   \/\/0<br \/>\n                        name: &#8216;id&#8217;,<br \/>\n                        data: &#8216;id&#8217;,<br \/>\n                        title: &#8220;Employee Id&#8221;,<br \/>\n                        orderable: true,<br \/>\n                        searchable: false,<br \/>\n                        type: &#8216;num&#8217;,<br \/>\n                        visible: false<br \/>\n                    },<br \/>\n                    {<br \/>\n                        \/\/1<br \/>\n                        name: &#8216;givenName&#8217;,<br \/>\n                        data: &#8220;givenName&#8221;,<br \/>\n                        title: &#8220;Given Name&#8221;,<br \/>\n                        orderable: true,<br \/>\n                        searchable: true,<br \/>\n                        type: &#8216;string&#8217;,<br \/>\n                        visible: true<br \/>\n                    },<br \/>\n                    {<br \/>\n                        \/\/2<br \/>\n                        name: &#8216;familyName&#8217;,<br \/>\n                        data: &#8220;familyName&#8221;,<br \/>\n                        title: &#8220;Family Name&#8221;,<br \/>\n                        orderable: true,<br \/>\n                        searchable: true,<br \/>\n                        type: &#8216;string&#8217;,<br \/>\n                        visible: true<br \/>\n                    },<br \/>\n                    {<br \/>\n                        \/\/3<br \/>\n                        name: &#8216;town&#8217;,<br \/>\n                        data: &#8220;town&#8221;,<br \/>\n                        title: &#8220;Town&#8221;,<br \/>\n                        orderable: true,<br \/>\n                        searchable: true,<br \/>\n                        type: &#8216;string&#8217;,<br \/>\n                        visible: true<br \/>\n                    },<br \/>\n                    {<br \/>\n                        \/\/4<br \/>\n                        name: &#8216;country&#8217;,<br \/>\n                        data: &#8220;country&#8221;,<br \/>\n                        title: &#8220;Country&#8221;,<br \/>\n                        orderable: true,<br \/>\n                        searchable: true,<br \/>\n                        type: &#8216;string&#8217;,<br \/>\n                        visible: true,<br \/>\n                        width: &#8220;150px&#8221;,<br \/>\n                        className: &#8216;text-center &#8216;<br \/>\n                    },<br \/>\n                    {<br \/>\n                        \/\/5<br \/>\n                        name: &#8217;email&#8217;,<br \/>\n                        data: &#8220;email&#8221;,<br \/>\n                        title: &#8220;Email&#8221;,<br \/>\n                        orderable: true,<br \/>\n                        searchable: true,<br \/>\n                        type: &#8216;string&#8217;,<br \/>\n                        visible: true<br \/>\n                    },<br \/>\n                    {<br \/>\n                        \/\/6<br \/>\n                        name: &#8216;phoneNo&#8217;,<br \/>\n                        data: &#8220;phoneNo&#8221;,<br \/>\n                        title: &#8220;Phone Number&#8221;,<br \/>\n                        orderable: false,<br \/>\n                        searchable: true,<br \/>\n                        type: &#8216;string&#8217;,<br \/>\n                        visible: true<br \/>\n                    }<br \/>\n                ],<\/p>\n<p>                layout: {<br \/>\n                    top1Start: {<br \/>\n                        buttons:<br \/>\n                            [<br \/>\n                                {<br \/>\n                                    text: &#8216;Filter&#8217;,<br \/>\n                                    action: AdvancedFilter<br \/>\n                                }<br \/>\n                            ]\n                    }<br \/>\n                }<br \/>\n            } \/\/ end of initialization object<br \/>\n        );<\/p>\n<p>        function AdvancedFilter(e, dt, node, config) {<br \/>\n            let EmployeesAdvancedFilter = &#8220;@Url.Action(&#8220;EmployeesAdvancedFilter&#8221;, &#8220;Home&#8221;)&#8221;;<br \/>\n            \/\/redirect to another page<br \/>\n            window.location.replace(EmployeesAdvancedFilter);<br \/>\n        };<br \/>\n    }<br \/>\n&lt;\/script&gt;<\/p>\n<p>\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u062f\u0641\u062a\u0631\u0686\u0647 \u0631\u0627\u0647\u0646\u0645\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f [1]. \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0641\u0642\u0637 \u06cc\u06a9 \u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645 \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637 ASP.NET \u0627\u0633\u062a.<\/p>\n<p>  5 \u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 ASP.NET<\/p>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631 \u0642\u0633\u0645\u062a C#\/.NET \u0647\u0633\u062a\u06cc\u0645 \u0648 \u06a9\u062f ASP.NET \u062e\u0648\u062f \u0631\u0627 \u0645\u06cc \u0646\u0648\u06cc\u0633\u06cc\u0645. \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062f\u0631 \u0627\u06a9\u0634\u0646 Employees() \u0648 \u062f\u0631 \u0645\u062a\u062f FilterRowsPerSavedAdvancedFilterState() \u0648\u0636\u0639\u06cc\u062a \u0641\u06cc\u0644\u062a\u0631 \u0631\u0627 \u0627\u0632 \u0634\u06cc ASP.NET Session \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f. \u062a\u0631\u0641\u0646\u062f \u0627\u0635\u0644\u06cc \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0637\u0648\u0644 \u0647\u0631 \u062a\u0645\u0627\u0633 AJAX\u060c \u0645\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648\u0636\u0639\u06cc\u062a \u0641\u06cc\u0644\u062a\u0631 \u0627\u0632 \u0634\u06cc ASP.NET Session  \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u0641\u06cc\u0644\u062a\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0631\u062f\u0627\u0632\u0634 back-end \u062c\u062f\u0648\u0644 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\/\/\/\/EmployeesVM.cs<br \/>\nnamespace Example09.Models.Home<br \/>\n{<br \/>\n    public class EmployeesVM<br \/>\n    {<br \/>\n        \/\/view model<br \/>\n        public String? AdvancedFilterState { get; set; } = null;<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/HomeController.cs ======================================<br \/>\nnamespace Example09.Controllers<br \/>\n{<br \/>\n    public class HomeController : Controller<br \/>\n    {<br \/>\n        public const string EMPLOYEES_ADVANCED_FILTER_STATE = &#8220;EMPLOYEES_ADVANCED_FILTER_STATE&#8221;;<\/p>\n<p>public IActionResult Employees(EmployeesVM model)<br \/>\n{<br \/>\n    try<br \/>\n    {<br \/>\n        ISession? CurrentSession = this.HttpContext?.Session;<\/p>\n<p>        {<br \/>\n            \/\/we get advanced-filter state from session if there is one<br \/>\n            string? jsonUserEmployeesAdvancedFilterState = CurrentSession?.GetString(EMPLOYEES_ADVANCED_FILTER_STATE);<\/p>\n<p>            if (!string.IsNullOrEmpty(jsonUserEmployeesAdvancedFilterState))<br \/>\n            {<br \/>\n                EmployeesAdvancedFilterVM? AdvancedFilterState =<br \/>\n                    JsonSerializer.Deserialize&lt;EmployeesAdvancedFilterVM&gt;(jsonUserEmployeesAdvancedFilterState);<\/p>\n<p>                if (AdvancedFilterState != null)<br \/>\n                {<br \/>\n                    string filterState =<br \/>\n                        &#8220;Given Name: &#8221; + AdvancedFilterState.FirstName +<br \/>\n                        &#8220;; Family Name: &#8221; + AdvancedFilterState.LastName +<br \/>\n                        &#8220;; Town: &#8221; + AdvancedFilterState.City+<br \/>\n                        &#8220;; Country: &#8221; + AdvancedFilterState.Country ;<br \/>\n                    model.AdvancedFilterState = filterState;<br \/>\n                }<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n    catch (Exception ex)<br \/>\n    {<br \/>\n        Console.WriteLine(ex.ToString());<br \/>\n    }<br \/>\n    return View(model);<br \/>\n}<\/p>\n<p>\/\/this is target of AJAX call and provides data for<br \/>\n\/\/the table, based on selected input parameters<br \/>\npublic IActionResult EmployeesDT(DataTables.AspNet.Core.IDataTablesRequest request)<br \/>\n{<br \/>\n    \/\/ There is dependency in this method on names of fields<br \/>\n    \/\/ and implied mapping. I see it almost impossible to avoid.<br \/>\n    \/\/ At least, in this method, we avoided dependency on the order<br \/>\n    \/\/ of table fields, in case order needs to be changed<br \/>\n    \/\/Here are our mapped table columns:<br \/>\n    \/\/Column0 id -&gt; Employee.Id<br \/>\n    \/\/Column1 givenName -&gt; Employee.FirstName<br \/>\n    \/\/Column2 familyName -&gt; Employee.LastName<br \/>\n    \/\/Column3 town -&gt; Employee.City<br \/>\n    \/\/Column4 country -&gt; Employee.Country<br \/>\n    \/\/Column5 email -&gt; Employee.Email<br \/>\n    \/\/Column6 phoneNo -&gt; Employee.Phone<\/p>\n<p>    try<br \/>\n    {<br \/>\n        IQueryable&lt;Employee&gt; employees = MockDatabase.MockDatabase.Instance.EmployeesTable.AsQueryable();<\/p>\n<p>        \/\/here we get the count that needs to be presented by the UI<br \/>\n        int totalRecordsCount = employees.Count();<\/p>\n<p>        employees = FilterRowsPerSavedAdvancedFilterState(employees);<\/p>\n<p>        var iQueryableOfAnonymous = employees.Select(p =&gt; new<br \/>\n        {<br \/>\n            id = p.Id,<br \/>\n            givenName = p.FirstName,<br \/>\n            familyName = p.LastName,<br \/>\n            town = p.City,<br \/>\n            country = p.Country,<br \/>\n            email = p.Email,<br \/>\n            phoneNo = p.Phone,<br \/>\n        });<\/p>\n<p>        \/\/here we get the count that needs to be presented by the UI<br \/>\n        int filteredRecordsCount = iQueryableOfAnonymous.Count();<\/p>\n<p>        iQueryableOfAnonymous = SortRowsPerRequestParamters(iQueryableOfAnonymous, request);<\/p>\n<p>        iQueryableOfAnonymous = iQueryableOfAnonymous.Skip(request.Start).Take(request.Length);<\/p>\n<p>        \/\/here we materialize the query<br \/>\n        var dataPage = iQueryableOfAnonymous.ToList();<\/p>\n<p>        var response = DataTablesResponse.Create(request, totalRecordsCount, filteredRecordsCount, dataPage);<\/p>\n<p>        return new DataTablesJsonResult(response, false);<br \/>\n    }<br \/>\n    catch (Exception ex)<br \/>\n    {<br \/>\n        Console.WriteLine(ex.ToString());<br \/>\n        var response = DataTablesResponse.Create(request, &#8220;Error processing AJAX call on server side&#8221;);<br \/>\n        return new DataTablesJsonResult(response, false);<br \/>\n    }<br \/>\n}<\/p>\n<p>private IQueryable&lt;Example09.MockDatabase.Employee&gt; FilterRowsPerSavedAdvancedFilterState(<br \/>\n   IQueryable&lt;Example09.MockDatabase.Employee&gt; iQueryableOfEmployee)<br \/>\n{<br \/>\n    try<br \/>\n    {<br \/>\n        ISession? CurrentSession = this.HttpContext?.Session;<\/p>\n<p>        {<br \/>\n            \/\/we get advanced-filter state from session if there is one<br \/>\n            string? jsonUserEmployeesAdvancedFilterState = CurrentSession?.GetString(EMPLOYEES_ADVANCED_FILTER_STATE);<\/p>\n<p>            if (!string.IsNullOrEmpty(jsonUserEmployeesAdvancedFilterState))<br \/>\n            {<br \/>\n                EmployeesAdvancedFilterVM? advancedFilter =<br \/>\n                    JsonSerializer.Deserialize&lt;EmployeesAdvancedFilterVM&gt;(jsonUserEmployeesAdvancedFilterState);<\/p>\n<p>                if (advancedFilter != null)<br \/>\n                {<br \/>\n                    \/\/FirstName<br \/>\n                    advancedFilter.FirstName = advancedFilter.FirstName?.Trim();<br \/>\n                    if (!string.IsNullOrEmpty(advancedFilter.FirstName))<br \/>\n                    {<br \/>\n                        \/*<br \/>\n                         * In EF we would go for DbFunctions.Like<br \/>\n                        if (advancedFilter.FirstName.Contains(&#8216;*&#8217;) || advancedFilter.FirstName.Contains(&#8216;?&#8217;))<br \/>\n                        {<br \/>\n                            string pattern = advancedFilter.FirstName.Replace(&#8216;*&#8217;, &#8216;%&#8217;).Replace(&#8216;?&#8217;, &#8216;_&#8217;);<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(vk =&gt; DbFunctions.Like(vk.FirstName, pattern));<br \/>\n                        }<br \/>\n                        else<br \/>\n                        {<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.FirstName != null &amp;&amp; vk.FirstName.Equals(advancedFilter.FirstName));<br \/>\n                        }<br \/>\n                        *\/<\/p>\n<p>                        \/\/in pure Linq going for Regex<br \/>\n                        if (advancedFilter.FirstName.Contains(&#8216;*&#8217;) || advancedFilter.FirstName.Contains(&#8216;?&#8217;))<br \/>\n                        {<br \/>\n                            string pattern = advancedFilter.FirstName.Replace(&#8220;*&#8221;, &#8220;.*&#8221;).Replace(&#8220;?&#8221;, &#8220;.{1}&#8221;);<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.FirstName != null &amp;&amp; Regex.IsMatch(vk.FirstName, pattern));<br \/>\n                        }<br \/>\n                        else<br \/>\n                        {<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.FirstName != null &amp;&amp; vk.FirstName.Equals(advancedFilter.FirstName));<br \/>\n                        }<br \/>\n                    }<\/p>\n<p>                    \/\/LastName<br \/>\n                    advancedFilter.LastName = advancedFilter.LastName?.Trim();<br \/>\n                    if (!string.IsNullOrEmpty(advancedFilter.LastName))<br \/>\n                    {<br \/>\n                        \/\/in pure Linq going for Regex<br \/>\n                        if (advancedFilter.LastName.Contains(&#8216;*&#8217;) || advancedFilter.LastName.Contains(&#8216;?&#8217;))<br \/>\n                        {<br \/>\n                            string pattern = advancedFilter.LastName.Replace(&#8220;*&#8221;, &#8220;.*&#8221;).Replace(&#8220;?&#8221;, &#8220;.{1}&#8221;);<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.LastName != null &amp;&amp; Regex.IsMatch(vk.LastName, pattern));<br \/>\n                        }<br \/>\n                        else<br \/>\n                        {<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.LastName != null &amp;&amp; vk.LastName.Equals(advancedFilter.LastName));<br \/>\n                        }<br \/>\n                    }<\/p>\n<p>                    \/\/City<br \/>\n                    advancedFilter.City = advancedFilter.City?.Trim();<br \/>\n                    if (!string.IsNullOrEmpty(advancedFilter.City))<br \/>\n                    {<br \/>\n                        \/\/in pure Linq going for Regex<br \/>\n                        if (advancedFilter.City.Contains(&#8216;*&#8217;) || advancedFilter.City.Contains(&#8216;?&#8217;))<br \/>\n                        {<br \/>\n                            string pattern = advancedFilter.City.Replace(&#8220;*&#8221;, &#8220;.*&#8221;).Replace(&#8220;?&#8221;, &#8220;.{1}&#8221;);<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.City != null &amp;&amp; Regex.IsMatch(vk.City, pattern));<br \/>\n                        }<br \/>\n                        else<br \/>\n                        {<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.City != null &amp;&amp; vk.City.Equals(advancedFilter.City));<br \/>\n                        }<br \/>\n                    }<\/p>\n<p>                    \/\/Country<br \/>\n                    advancedFilter.Country = advancedFilter.Country?.Trim();<br \/>\n                    if (!string.IsNullOrEmpty(advancedFilter.Country))<br \/>\n                    {<br \/>\n                        \/\/in pure Linq going for Regex<br \/>\n                        if (advancedFilter.Country.Contains(&#8216;*&#8217;) || advancedFilter.Country.Contains(&#8216;?&#8217;))<br \/>\n                        {<br \/>\n                            string pattern = advancedFilter.Country.Replace(&#8220;*&#8221;, &#8220;.*&#8221;).Replace(&#8220;?&#8221;, &#8220;.{1}&#8221;);<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.Country != null &amp;&amp; Regex.IsMatch(vk.Country, pattern));<br \/>\n                        }<br \/>\n                        else<br \/>\n                        {<br \/>\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(<br \/>\n                                vk =&gt; vk.Country != null &amp;&amp; vk.Country.Equals(advancedFilter.Country));<br \/>\n                        }<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n    catch (Exception ex)<br \/>\n    {<br \/>\n        Console.WriteLine(ex.ToString());<br \/>\n    }<\/p>\n<p>    return iQueryableOfEmployee;<br \/>\n}       <\/p>\n<p>  6 \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0645\u0644 \u067e\u0631\u0648\u0698\u0647 \u06a9\u062f \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 GitHub \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0631\u062f [99].<\/p>\n<p>  7 \u0645\u0631\u0627\u062c\u0639<\/p>\n[1]  https:\/\/datatables.net\/<\/p>\n[99]  https:\/\/github.com\/MarkPelf\/ASPNET8UsingDataTablesNet    <\/p>\n<p>\u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0639\u0645\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a jQuery DataTables.net \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Asp.Net 8 MVC.<\/p>\n<p><strong><em>\u0686\u06a9\u06cc\u062f\u0647: \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0639\u0645\u0644\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Asp.Net 8 MVC \u06a9\u0647 \u0627\u0632 \u0645\u0648\u0644\u0641\u0647 jQuery DataTables.net \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0627\u062f\u0627\u0645\u0647 \u0645\u0642\u0627\u0644\u0647 Part8 \u0627\u0633\u062a.<\/em><\/strong><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#1_ASPNET8_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_jQuery_DataTablesnet\" >1 ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 jQuery DataTables.net<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#11_%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA_%D8%A7%DB%8C%D9%86_%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87\" >1.1 \u0645\u0642\u0627\u0644\u0627\u062a \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#2_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\" >2 \u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#3_%D9%81%D8%B1%D9%85_%D9%81%DB%8C%D9%84%D8%AA%D8%B1_%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87\" >3 \u0641\u0631\u0645 \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#4_%D8%AC%D8%B2%D8%A1_DataTablesnet_%D8%B3%D9%85%D8%AA_%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA\" >4 \u062c\u0632\u0621 DataTables.net \u0633\u0645\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#5_%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4_%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86_ASPNET\" >5 \u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 ASP.NET<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#6_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >6 \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/aspnet8-using-datatablesnet-part9-advanced-filters-4m5m\/#7_%D9%85%D8%B1%D8%A7%D8%AC%D8%B9\" >7 \u0645\u0631\u0627\u062c\u0639<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"1_ASPNET8_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_jQuery_DataTablesnet\"><\/span>\n<p>  1 ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 jQuery DataTables.net<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 \u0645\u0648\u0644\u0641\u0647 jQuery DataTables.net \u0631\u0627 \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0631\u062f\u0645 [1] \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627\u06cc ASP.NET8 \u0648 \u0627\u06cc\u062c\u0627\u062f \u0686\u0646\u062f\u06cc\u0646 <strong><em>\u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0646\u0645\u0648\u0646\u0647 \u0627\u0648\u0644\u06cc\u0647 (\u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645).<\/em><\/strong>  \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0627\u062a \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"11_%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA_%D8%A7%DB%8C%D9%86_%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87\"><\/span>\n<p>  1.1 \u0645\u0642\u0627\u0644\u0627\u062a \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0642\u0627\u0644\u0627\u062a \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<ul>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part1 \u2013 Foundation<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u06a9\u0645\u0647 \u0647\u0627\u06cc DataTables.net \u2013 Part2 \u2013 Action<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part3 \u2013 \u062d\u0627\u0644\u062a \u0630\u062e\u06cc\u0631\u0647<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part4 \u2013 Multilingual<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part5 \u2013 \u0627\u0631\u0633\u0627\u0644 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u062f\u0631 AJAX<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part6 \u2013 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u062f\u0631 AJAX<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part7 \u2013 \u062f\u06a9\u0645\u0647 \u0647\u0627\u06cc \u0645\u0646\u0638\u0645<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part8 \u2013 \u0633\u0637\u0631\u0647\u0627 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f<\/strong><\/li>\n<li><strong>ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 DataTables.net \u2013 Part9 \u2013 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<\/strong><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"2_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\"><\/span>\n<p>  2 \u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0647\u062f\u0641 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0624\u0644\u0641\u0647 DataTables.net \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u062f. <strong><em>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc<\/em><\/strong>. \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0646\u062a\u06cc\u062c\u0647 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u06cc\u0645.<\/p>\n<p><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2id5x9lxo6zxc5u3gqk3.png\" width=\"800\" height=\"515\" alt=\"\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644\u060c \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0645\u0624\u0644\u0641\u0647 DataTables.net \u0631\u0627 \u062f\u0631 \u06af\u0648\u0634\u0647 \u0628\u0627\u0644\u0627 \u0633\u0645\u062a \u0631\u0627\u0633\u062a \u063a\u06cc\u0631\u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u06cc\u0645 \u0648 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645. <strong><em>\u0641\u0631\u0645 \u0633\u0641\u0627\u0631\u0634\u06cc \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<\/em><\/strong>. \u06a9\u0627\u062f\u0631 \u0641\u06cc\u0644\u062a\u0631 (\u062c\u0633\u062a\u062c\u0648) \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0633\u0627\u062f\u0647 \u0628\u0648\u062f \u0648 \u0645\u0642\u062f\u0627\u0631 \u06cc\u06a9\u0633\u0627\u0646\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0633\u062a\u0648\u0646 \u0647\u0627 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0631\u062f. \u0627\u063a\u0644\u0628 \u062f\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0647\u0627\u06cc \u062d\u0631\u0641\u0647 \u0627\u06cc\u060c \u0641\u0631\u062f \u0628\u0647 \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u0641\u06cc\u0644\u062a\u0631\u06cc\u0646\u06af \u062f\u0642\u06cc\u0642 \u062a\u0631\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f.<\/p>\n<p>\u0645\u0646 \u0628\u0627 \u062f\u0642\u062a \u0628\u0647 \u0633\u0627\u06cc\u062a \u0646\u06af\u0627\u0647 \u06a9\u0631\u062f\u0645 [1] \u062f\u0631 \u062a\u0645\u0627\u0645 \u0627\u0641\u0632\u0648\u0646\u0647\u200c\u0647\u0627 \u0648 \u0627\u0641\u0632\u0648\u0646\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0624\u0644\u0641\u0647 DataTables.net \u0628\u0631\u0627\u06cc \u0641\u06cc\u0644\u062a\u0631 \u06a9\u0631\u062f\u0646 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u0645\u0627 \u0645\u0646 \u0686\u06cc\u0632\u06cc \u0631\u0627 \u06a9\u0647 \u0622\u0646\u062c\u0627 \u0628\u0648\u062f \u062f\u0648\u0633\u062a \u0646\u062f\u0627\u0634\u062a\u0645\u060c \u0647\u06cc\u0686 \u0686\u06cc\u0632 \u0628\u0647 \u0627\u0646\u062f\u0627\u0632\u0647 \u06a9\u0627\u0641\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u0645 \u062d\u0631\u0641\u0647 \u0627\u06cc \u0646\u0628\u0648\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0645\u0642\u062f\u0627\u0631\u06cc \u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc \u062f\u0631 ASP.NET \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645 \u0648 \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0645 \u0648 \u062c\u0632\u0621 DataTables.net \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u062c\u062f\u0648\u0644 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u06a9\u0646\u0645. \u0631\u0627\u0647 \u062d\u0644 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0647\u0645\u0627\u0646 \u0686\u06cc\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0628\u0647 \u0622\u0646 \u0631\u0633\u06cc\u062f\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"3_%D9%81%D8%B1%D9%85_%D9%81%DB%8C%D9%84%D8%AA%D8%B1_%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87\"><\/span>\n<p>  3 \u0641\u0631\u0645 \u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0641\u06cc\u0644\u062a\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0641\u0642\u0637 \u06cc\u06a9 \u0641\u0631\u0645 \u062f\u06cc\u06af\u0631 ASP.NET \u0627\u0633\u062a \u0648 \u0645\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 <strong><em>\u062d\u0627\u0644\u062a \u0641\u06cc\u0644\u062a\u0631 \u0631\u0627 \u062f\u0631 \u0634\u06cc\u0621 ASP.NET Session \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f<\/em><\/strong>\u060c \u0628\u0647 \u0637\u0648\u0631\u06cc \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0631 \u0637\u0648\u0644 \u0647\u0631 \u062a\u0645\u0627\u0633 AJAX \u0628\u0631\u0627\u06cc \u0645\u0624\u0644\u0641\u0647 DataTables \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f. \u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628 &#8220;\u0648\u0636\u0639\u06cc\u062a \u0641\u06cc\u0644\u062a\u0631&#8221; \u0628\u06cc\u0646 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \/ \u0641\u0631\u0645 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646\u0645 \u06a9\u062f \u0645\u0631\u0628\u0648\u0637\u0647\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"c1\">\/\/HomeController.cs ======================================<\/span>\n\n<span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">HomeController<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Controller<\/span>\n<span class=\"p\">{<\/span>\n<span class=\"k\">public<\/span> <span class=\"k\">const<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">EMPLOYEES_ADVANCED_FILTER_STATE<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"EMPLOYEES_ADVANCED_FILTER_STATE\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">public<\/span> <span class=\"n\">IActionResult<\/span> <span class=\"nf\">EmployeesAdvancedFilter<\/span><span class=\"p\">(<\/span><span class=\"n\">EmployeesAdvancedFilterVM<\/span> <span class=\"n\">model<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">{<\/span>           \n    <span class=\"k\">try<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">ISession<\/span> <span class=\"p\">?<\/span> <span class=\"n\">CurrentSession<\/span><span class=\"p\">=<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">HttpContext<\/span><span class=\"p\">?.<\/span><span class=\"n\">Session<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">IsSubmit<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/we have submit<\/span>\n            <span class=\"c1\">\/\/we save the advanced-filter state to session<\/span>\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">CurrentSession<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">model<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">=<\/span><span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span> <span class=\"p\">=<\/span> <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span> <span class=\"p\">=<\/span> <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                <span class=\"kt\">string<\/span> <span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span> <span class=\"p\">=<\/span> <span class=\"n\">JsonSerializer<\/span><span class=\"p\">.<\/span><span class=\"nf\">Serialize<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">);<\/span>\n                <span class=\"n\">CurrentSession<\/span><span class=\"p\">.<\/span><span class=\"nf\">SetString<\/span><span class=\"p\">(<\/span><span class=\"n\">EMPLOYEES_ADVANCED_FILTER_STATE<\/span><span class=\"p\">,<\/span> <span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span><span class=\"p\">);<\/span>\n            <span class=\"p\">}<\/span>\n\n            <span class=\"k\">return<\/span> <span class=\"nf\">RedirectToAction<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Employees\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Home\"<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">IsReset<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/we have reset<\/span>\n            <span class=\"c1\">\/\/we clear advanced-filter state in session<\/span>\n            <span class=\"n\">CurrentSession<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Remove<\/span><span class=\"p\">(<\/span><span class=\"n\">EMPLOYEES_ADVANCED_FILTER_STATE<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/go for presentation<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/we get advanced-filter state from session if there is one<\/span>\n            <span class=\"kt\">string<\/span><span class=\"p\">?<\/span> <span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span> <span class=\"p\">=<\/span> <span class=\"n\">CurrentSession<\/span><span class=\"p\">?.<\/span><span class=\"nf\">GetString<\/span><span class=\"p\">(<\/span><span class=\"n\">EMPLOYEES_ADVANCED_FILTER_STATE<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span><span class=\"p\">))<\/span> \n            <span class=\"p\">{<\/span>\n                <span class=\"n\">model<\/span> <span class=\"p\">=<\/span> <span class=\"n\">JsonSerializer<\/span><span class=\"p\">.<\/span><span class=\"n\">Deserialize<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">EmployeesAdvancedFilterVM<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span><span class=\"p\">)<\/span>\n                    <span class=\"p\">??<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">EmployeesAdvancedFilterVM<\/span><span class=\"p\">();<\/span>\n            <span class=\"p\">}<\/span>                    \n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">ex<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"nf\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"p\">.<\/span><span class=\"nf\">ToString<\/span><span class=\"p\">());<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"nf\">View<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/EmployeesAdvancedFilterVM.cs<\/span>\n<span class=\"k\">namespace<\/span> <span class=\"nn\">Example09.Models.Home<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">EmployeesAdvancedFilterVM<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/model<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span><span class=\"p\">?<\/span> <span class=\"n\">FirstName<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span><span class=\"p\">?<\/span> <span class=\"n\">LastName<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span><span class=\"p\">?<\/span> <span class=\"n\">City<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span><span class=\"p\">?<\/span> <span class=\"n\">Country<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">IsSubmit<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">false<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">IsReset<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">false<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"c1\">\/\/view model<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>&lt;!-- EmployeesAdvancedFilter.cshtml --&gt;\n@using Example09.Models.Home;\n\n@model EmployeesAdvancedFilterVM\n\n@{\n    &lt;div class=\"text-center\"&gt;\n        &lt;h3 class=\"display-4\"&gt;Employees Advanced Filter&lt;\/h3&gt;\n    &lt;\/div&gt;\n\n    &lt;fieldset class=\"border rounded-3 p-3\" style=\"width:600px\"&gt;\n        &lt;legend class=\"float-none w-auto px-3\"&gt;Choose filter parameters&lt;\/legend&gt;\n\n        &lt;p class=\"bg-light m-1 border p-1\"&gt;\n        * = whildchar, zero or more characters &lt;br\/&gt;\n        ? = whildchar, one character\n        &lt;\/p&gt;\n\n        &lt;form id=\"form1\" method=\"post\"&gt;                  \n\n            &lt;div class=\"form-group\"&gt;\n                &lt;label asp-for=FirstName&gt;Given Name&lt;\/label&gt;\n                &lt;input class=\"form-control\" asp-for=\"FirstName\" \/&gt;\n            &lt;\/div&gt;\n\n            &lt;div class=\"form-group\"&gt;\n                &lt;label asp-for=LastName&gt;Family Name&lt;\/label&gt;\n                &lt;input class=\"form-control\" asp-for=\"LastName\" \/&gt;\n            &lt;\/div&gt;\n\n            &lt;div class=\"form-group\"&gt;\n                &lt;label asp-for=City&gt;Town&lt;\/label&gt;\n                &lt;input class=\"form-control\" asp-for=\"City\" \/&gt;\n            &lt;\/div&gt;\n\n            &lt;div class=\"form-group\"&gt;\n                &lt;label asp-for=Country&gt;&lt;\/label&gt;\n                &lt;input class=\"form-control\" asp-for=\"Country\" \/&gt;\n            &lt;\/div&gt;\n\n            &lt;button type=\"submit\" form=\"form1\" class=\"btn btn-primary mt-3 ms-3 float-end\" asp-area=\"\" \n                asp-controller=\"Home\" asp-action=\"EmployeesAdvancedFilter\" asp-route-IsSubmit=\"true\"&gt;\n                Submit\n            &lt;\/button&gt;\n\n            &lt;a class=\"btn btn-primary mt-3 float-end\" asp-area=\"\"\n                    asp-controller=\"Home\" asp-action=\"EmployeesAdvancedFilter\" asp-route-IsReset=\"true\"&gt;\n                Reset\n            &lt;\/a&gt;\n        &lt;\/form&gt;\n    &lt;\/fieldset&gt;\n}\n\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"4_%D8%AC%D8%B2%D8%A1_DataTablesnet_%D8%B3%D9%85%D8%AA_%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA\"><\/span>\n<p>  4 \u062c\u0632\u0621 DataTables.net \u0633\u0645\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0646 \u0641\u0642\u0637 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0646\u0645\u0627\u06cc ASP.NET \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0624\u0644\u0641\u0647 DataTables \u0686\u06af\u0648\u0646\u0647 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>&lt;!-- Employees.cshtml --&gt;\n@using Example09.Models.Home;\n\n@model EmployeesVM\n\n&lt;partial name=\"_LoadingDatatablesJsAndCss\" \/&gt;\n\n@{\n    &lt;div class=\"text-center\"&gt;\n        &lt;h3 class=\"display-4\"&gt;Employees table - Advanced Filter&lt;\/h3&gt;\n    &lt;\/div&gt;\n\n    &lt;h4 class=\"bg-info m-4 border p-3\"&gt;\n        @{\n            string text1 = \"Filter= \" + Model?.AdvancedFilterState;\n            @text1\n        }\n    &lt;\/h4&gt;\n\n    &lt;!-- Here is our table HTML element defined. JavaScript library Datatables\n    will do all the magic to turn it into interactive component --&gt;\n    &lt;table id=\"EmployeesTable01\" class=\"table table-striped table-bordered \"&gt;\n    &lt;\/table&gt;\n}\n\n&lt;script type=\"text\/javascript\"&gt;\n    \/\/ Datatables script initialization =========================================\n    \/\/ we used defer attribute on jQuery so it might not be available at this point\n    \/\/ so we go for vanilla JS event\n\n    document.addEventListener(\"DOMContentLoaded\", InitializeDatatable);\n\n    function InitializeDatatable() {\n        $(\"#EmployeesTable01\").dataTable(\n            \/\/providing initialization parameters as JavaScript object\n            {\n                \/\/processing-Feature control the processing indicator.\n                processing: true,\n                \/\/paging-Enable or disable table pagination.\n                paging: true,\n                \/\/info-Feature control table information display field\n                info: true,\n                \/\/ordering-Feature control ordering (sorting) abilities in DataTables.\n                ordering: true,\n                \/\/searching-Feature control search (filtering) abilities\n                searching: false,\n\n                \/\/autoWidth-Feature control DataTables' smart column width handling.\n                autoWidth: true,\n                \/\/lengthMenu-Change the options in the page length select list.\n                lengthMenu: [10, 15, 25, 50, 100],\n                \/\/pageLength-Change the initial page length (number of rows per page)\n                pageLength: 10,\n\n                \/\/order-Initial order (sort) to apply to the table.\n                order: [[1, 'asc']],\n\n                \/\/serverSide-Feature control DataTables' server-side processing mode.\n                serverSide: true,\n\n                \/\/Load data for the table's content from an Ajax source.\n                ajax: {\n                    \"url\": \"@Url.Action(\"EmployeesDT\", \"Home\")\",\n                    \"type\": \"POST\",\n                    \"datatype\": \"json\"\n                },\n\n                \/\/Set column specific initialisation properties.\n                columns: [\n                    \/\/name-Set a descriptive name for a column\n                    \/\/data-Set the data source for the column from the rows data object \/ array\n                    \/\/title-Set the column title\n                    \/\/orderable-Enable or disable ordering on this column\n                    \/\/searchable-Enable or disable search on the data in this column\n                    \/\/type-Set the column type - used for filtering and sorting string processing\n                    \/\/visible-Enable or disable the display of this column.\n                    \/\/width-Column width assignment.\n                    \/\/render-Render (process) the data for use in the table.\n                    \/\/className-Class to assign to each cell in the column.\n\n                    {   \/\/0\n                        name: 'id',\n                        data: 'id',\n                        title: \"Employee Id\",\n                        orderable: true,\n                        searchable: false,\n                        type: 'num',\n                        visible: false\n                    },\n                    {\n                        \/\/1\n                        name: 'givenName',\n                        data: \"givenName\",\n                        title: \"Given Name\",\n                        orderable: true,\n                        searchable: true,\n                        type: 'string',\n                        visible: true\n                    },\n                    {\n                        \/\/2\n                        name: 'familyName',\n                        data: \"familyName\",\n                        title: \"Family Name\",\n                        orderable: true,\n                        searchable: true,\n                        type: 'string',\n                        visible: true\n                    },\n                    {\n                        \/\/3\n                        name: 'town',\n                        data: \"town\",\n                        title: \"Town\",\n                        orderable: true,\n                        searchable: true,\n                        type: 'string',\n                        visible: true\n                    },\n                    {\n                        \/\/4\n                        name: 'country',\n                        data: \"country\",\n                        title: \"Country\",\n                        orderable: true,\n                        searchable: true,\n                        type: 'string',\n                        visible: true,\n                        width: \"150px\",\n                        className: 'text-center '\n                    },\n                    {\n                        \/\/5\n                        name: 'email',\n                        data: \"email\",\n                        title: \"Email\",\n                        orderable: true,\n                        searchable: true,\n                        type: 'string',\n                        visible: true\n                    },\n                    {\n                        \/\/6\n                        name: 'phoneNo',\n                        data: \"phoneNo\",\n                        title: \"Phone Number\",\n                        orderable: false,\n                        searchable: true,\n                        type: 'string',\n                        visible: true\n                    }\n                ],\n\n                layout: {\n                    top1Start: {\n                        buttons:\n                            [\n                                {\n                                    text: 'Filter',\n                                    action: AdvancedFilter\n                                }\n                            ]\n                    }\n                }\n            } \/\/ end of initialization object\n        );\n\n        function AdvancedFilter(e, dt, node, config) {\n            let EmployeesAdvancedFilter = \"@Url.Action(\"EmployeesAdvancedFilter\", \"Home\")\";\n            \/\/redirect to another page\n            window.location.replace(EmployeesAdvancedFilter);\n        };\n    }\n&lt;\/script&gt;\n\n\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u062f\u0641\u062a\u0631\u0686\u0647 \u0631\u0627\u0647\u0646\u0645\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f [1]. \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0641\u0642\u0637 \u06cc\u06a9 \u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645 \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637 ASP.NET \u0627\u0633\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"5_%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4_%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86_ASPNET\"><\/span>\n<p>  5 \u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646 ASP.NET<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631 \u0642\u0633\u0645\u062a C#\/.NET \u0647\u0633\u062a\u06cc\u0645 \u0648 \u06a9\u062f ASP.NET \u062e\u0648\u062f \u0631\u0627 \u0645\u06cc \u0646\u0648\u06cc\u0633\u06cc\u0645. \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062f\u0631 \u0627\u06a9\u0634\u0646 Employees() \u0648 \u062f\u0631 \u0645\u062a\u062f FilterRowsPerSavedAdvancedFilterState() <strong><em>\u0648\u0636\u0639\u06cc\u062a \u0641\u06cc\u0644\u062a\u0631 \u0631\u0627 \u0627\u0632 \u0634\u06cc ASP.NET Session \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f<\/em><\/strong>. \u062a\u0631\u0641\u0646\u062f \u0627\u0635\u0644\u06cc \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0637\u0648\u0644 \u0647\u0631 \u062a\u0645\u0627\u0633 AJAX\u060c \u0645\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645 <strong><em>\u0648\u0636\u0639\u06cc\u062a \u0641\u06cc\u0644\u062a\u0631 \u0627\u0632 \u0634\u06cc ASP.NET Session<\/em><\/strong>  \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u0641\u06cc\u0644\u062a\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0631\u062f\u0627\u0632\u0634 back-end \u062c\u062f\u0648\u0644 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"c1\">\/\/\/\/EmployeesVM.cs<\/span>\n<span class=\"k\">namespace<\/span> <span class=\"nn\">Example09.Models.Home<\/span>\n<span class=\"p\">{<\/span>    \n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">EmployeesVM<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/view model<\/span>\n        <span class=\"k\">public<\/span> <span class=\"n\">String<\/span><span class=\"p\">?<\/span> <span class=\"n\">AdvancedFilterState<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span>        \n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/HomeController.cs ======================================<\/span>\n<span class=\"k\">namespace<\/span> <span class=\"nn\">Example09.Controllers<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">HomeController<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Controller<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"k\">const<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">EMPLOYEES_ADVANCED_FILTER_STATE<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"EMPLOYEES_ADVANCED_FILTER_STATE\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">public<\/span> <span class=\"n\">IActionResult<\/span> <span class=\"nf\">Employees<\/span><span class=\"p\">(<\/span><span class=\"n\">EmployeesVM<\/span> <span class=\"n\">model<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">try<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">ISession<\/span><span class=\"p\">?<\/span> <span class=\"n\">CurrentSession<\/span> <span class=\"p\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">HttpContext<\/span><span class=\"p\">?.<\/span><span class=\"n\">Session<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/we get advanced-filter state from session if there is one<\/span>\n            <span class=\"kt\">string<\/span><span class=\"p\">?<\/span> <span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span> <span class=\"p\">=<\/span> <span class=\"n\">CurrentSession<\/span><span class=\"p\">?.<\/span><span class=\"nf\">GetString<\/span><span class=\"p\">(<\/span><span class=\"n\">EMPLOYEES_ADVANCED_FILTER_STATE<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span><span class=\"p\">))<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"n\">EmployeesAdvancedFilterVM<\/span><span class=\"p\">?<\/span> <span class=\"n\">AdvancedFilterState<\/span> <span class=\"p\">=<\/span>\n                    <span class=\"n\">JsonSerializer<\/span><span class=\"p\">.<\/span><span class=\"n\">Deserialize<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">EmployeesAdvancedFilterVM<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span><span class=\"p\">);<\/span>\n\n                <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">AdvancedFilterState<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span>\n                <span class=\"p\">{<\/span>\n                    <span class=\"kt\">string<\/span> <span class=\"n\">filterState<\/span> <span class=\"p\">=<\/span>\n                        <span class=\"s\">\"Given Name: \"<\/span> <span class=\"p\">+<\/span> <span class=\"n\">AdvancedFilterState<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span> <span class=\"p\">+<\/span>\n                        <span class=\"s\">\"; Family Name: \"<\/span> <span class=\"p\">+<\/span> <span class=\"n\">AdvancedFilterState<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span> <span class=\"p\">+<\/span>\n                        <span class=\"s\">\"; Town: \"<\/span> <span class=\"p\">+<\/span> <span class=\"n\">AdvancedFilterState<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">+<\/span>\n                        <span class=\"s\">\"; Country: \"<\/span> <span class=\"p\">+<\/span> <span class=\"n\">AdvancedFilterState<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span> <span class=\"p\">;<\/span>\n                    <span class=\"n\">model<\/span><span class=\"p\">.<\/span><span class=\"n\">AdvancedFilterState<\/span> <span class=\"p\">=<\/span> <span class=\"n\">filterState<\/span><span class=\"p\">;<\/span>    \n                <span class=\"p\">}<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">ex<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"nf\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"p\">.<\/span><span class=\"nf\">ToString<\/span><span class=\"p\">());<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">View<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/this is target of AJAX call and provides data for<\/span>\n<span class=\"c1\">\/\/the table, based on selected input parameters<\/span>\n<span class=\"k\">public<\/span> <span class=\"n\">IActionResult<\/span> <span class=\"nf\">EmployeesDT<\/span><span class=\"p\">(<\/span><span class=\"n\">DataTables<\/span><span class=\"p\">.<\/span><span class=\"n\">AspNet<\/span><span class=\"p\">.<\/span><span class=\"n\">Core<\/span><span class=\"p\">.<\/span><span class=\"n\">IDataTablesRequest<\/span> <span class=\"n\">request<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ There is dependency in this method on names of fields<\/span>\n    <span class=\"c1\">\/\/ and implied mapping. I see it almost impossible to avoid.<\/span>\n    <span class=\"c1\">\/\/ At least, in this method, we avoided dependency on the order<\/span>\n    <span class=\"c1\">\/\/ of table fields, in case order needs to be changed<\/span>\n    <span class=\"c1\">\/\/Here are our mapped table columns:<\/span>\n    <span class=\"c1\">\/\/Column0 id -&gt; Employee.Id<\/span>\n    <span class=\"c1\">\/\/Column1 givenName -&gt; Employee.FirstName<\/span>\n    <span class=\"c1\">\/\/Column2 familyName -&gt; Employee.LastName<\/span>\n    <span class=\"c1\">\/\/Column3 town -&gt; Employee.City<\/span>\n    <span class=\"c1\">\/\/Column4 country -&gt; Employee.Country<\/span>\n    <span class=\"c1\">\/\/Column5 email -&gt; Employee.Email<\/span>\n    <span class=\"c1\">\/\/Column6 phoneNo -&gt; Employee.Phone<\/span>\n\n    <span class=\"k\">try<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">IQueryable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">employees<\/span> <span class=\"p\">=<\/span> <span class=\"n\">MockDatabase<\/span><span class=\"p\">.<\/span><span class=\"n\">MockDatabase<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span><span class=\"p\">.<\/span><span class=\"n\">EmployeesTable<\/span><span class=\"p\">.<\/span><span class=\"nf\">AsQueryable<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"c1\">\/\/here we get the count that needs to be presented by the UI<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">totalRecordsCount<\/span> <span class=\"p\">=<\/span> <span class=\"n\">employees<\/span><span class=\"p\">.<\/span><span class=\"nf\">Count<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"n\">employees<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">FilterRowsPerSavedAdvancedFilterState<\/span><span class=\"p\">(<\/span><span class=\"n\">employees<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"kt\">var<\/span> <span class=\"n\">iQueryableOfAnonymous<\/span> <span class=\"p\">=<\/span> <span class=\"n\">employees<\/span><span class=\"p\">.<\/span><span class=\"nf\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"k\">new<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">id<\/span> <span class=\"p\">=<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Id<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">givenName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">familyName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">town<\/span> <span class=\"p\">=<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">country<\/span> <span class=\"p\">=<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">email<\/span> <span class=\"p\">=<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Email<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">phoneNo<\/span> <span class=\"p\">=<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Phone<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">});<\/span>\n\n        <span class=\"c1\">\/\/here we get the count that needs to be presented by the UI<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">filteredRecordsCount<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfAnonymous<\/span><span class=\"p\">.<\/span><span class=\"nf\">Count<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"n\">iQueryableOfAnonymous<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">SortRowsPerRequestParamters<\/span><span class=\"p\">(<\/span><span class=\"n\">iQueryableOfAnonymous<\/span><span class=\"p\">,<\/span> <span class=\"n\">request<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"n\">iQueryableOfAnonymous<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfAnonymous<\/span><span class=\"p\">.<\/span><span class=\"nf\">Skip<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">).<\/span><span class=\"nf\">Take<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"c1\">\/\/here we materialize the query<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">dataPage<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfAnonymous<\/span><span class=\"p\">.<\/span><span class=\"nf\">ToList<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"kt\">var<\/span> <span class=\"n\">response<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DataTablesResponse<\/span><span class=\"p\">.<\/span><span class=\"nf\">Create<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">,<\/span> <span class=\"n\">totalRecordsCount<\/span><span class=\"p\">,<\/span> <span class=\"n\">filteredRecordsCount<\/span><span class=\"p\">,<\/span> <span class=\"n\">dataPage<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">DataTablesJsonResult<\/span><span class=\"p\">(<\/span><span class=\"n\">response<\/span><span class=\"p\">,<\/span> <span class=\"k\">false<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">ex<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"nf\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"p\">.<\/span><span class=\"nf\">ToString<\/span><span class=\"p\">());<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">response<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DataTablesResponse<\/span><span class=\"p\">.<\/span><span class=\"nf\">Create<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Error processing AJAX call on server side\"<\/span><span class=\"p\">);<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">DataTablesJsonResult<\/span><span class=\"p\">(<\/span><span class=\"n\">response<\/span><span class=\"p\">,<\/span> <span class=\"k\">false<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n\n<span class=\"k\">private<\/span> <span class=\"n\">IQueryable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Example09<\/span><span class=\"p\">.<\/span><span class=\"n\">MockDatabase<\/span><span class=\"p\">.<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span> <span class=\"nf\">FilterRowsPerSavedAdvancedFilterState<\/span><span class=\"p\">(<\/span>\n   <span class=\"n\">IQueryable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Example09<\/span><span class=\"p\">.<\/span><span class=\"n\">MockDatabase<\/span><span class=\"p\">.<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">try<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">ISession<\/span><span class=\"p\">?<\/span> <span class=\"n\">CurrentSession<\/span> <span class=\"p\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">HttpContext<\/span><span class=\"p\">?.<\/span><span class=\"n\">Session<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/we get advanced-filter state from session if there is one<\/span>\n            <span class=\"kt\">string<\/span><span class=\"p\">?<\/span> <span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span> <span class=\"p\">=<\/span> <span class=\"n\">CurrentSession<\/span><span class=\"p\">?.<\/span><span class=\"nf\">GetString<\/span><span class=\"p\">(<\/span><span class=\"n\">EMPLOYEES_ADVANCED_FILTER_STATE<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span><span class=\"p\">))<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"n\">EmployeesAdvancedFilterVM<\/span><span class=\"p\">?<\/span> <span class=\"n\">advancedFilter<\/span> <span class=\"p\">=<\/span> \n                    <span class=\"n\">JsonSerializer<\/span><span class=\"p\">.<\/span><span class=\"n\">Deserialize<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">EmployeesAdvancedFilterVM<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">jsonUserEmployeesAdvancedFilterState<\/span><span class=\"p\">);<\/span>\n\n                <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span>\n                <span class=\"p\">{<\/span>\n                    <span class=\"c1\">\/\/FirstName<\/span>\n                    <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                    <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">))<\/span>\n                    <span class=\"p\">{<\/span>\n                        <span class=\"cm\">\/*\n                         * In EF we would go for DbFunctions.Like\n                        if (advancedFilter.FirstName.Contains('*') || advancedFilter.FirstName.Contains('?'))\n                        {\n                            string pattern = advancedFilter.FirstName.Replace('*', '%').Replace('?', '_');\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(vk =&gt; DbFunctions.Like(vk.FirstName, pattern));\n                        }\n                        else\n                        {\n                            iQueryableOfEmployee = iQueryableOfEmployee.Where(\n                                vk =&gt; vk.FirstName != null &amp;&amp; vk.FirstName.Equals(advancedFilter.FirstName));\n                        }\n                        *\/<\/span>\n\n                        <span class=\"c1\">\/\/in pure Linq going for Regex<\/span>\n                        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'*'<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'?'<\/span><span class=\"p\">))<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"kt\">string<\/span> <span class=\"n\">pattern<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"*\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".*\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"?\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".{1}\"<\/span><span class=\"p\">);<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsMatch<\/span><span class=\"p\">(<\/span><span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">,<\/span> <span class=\"n\">pattern<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                        <span class=\"k\">else<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Equals<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstName<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                    <span class=\"p\">}<\/span>\n\n                    <span class=\"c1\">\/\/LastName<\/span>\n                    <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                    <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">))<\/span>\n                    <span class=\"p\">{<\/span>\n                        <span class=\"c1\">\/\/in pure Linq going for Regex<\/span>\n                        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'*'<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'?'<\/span><span class=\"p\">))<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"kt\">string<\/span> <span class=\"n\">pattern<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"*\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".*\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"?\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".{1}\"<\/span><span class=\"p\">);<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsMatch<\/span><span class=\"p\">(<\/span><span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">,<\/span> <span class=\"n\">pattern<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                        <span class=\"k\">else<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">.<\/span><span class=\"nf\">Equals<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">LastName<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                    <span class=\"p\">}<\/span>\n\n                    <span class=\"c1\">\/\/City<\/span>\n                    <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                    <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">))<\/span>\n                    <span class=\"p\">{<\/span>\n                        <span class=\"c1\">\/\/in pure Linq going for Regex<\/span>\n                        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'*'<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'?'<\/span><span class=\"p\">))<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"kt\">string<\/span> <span class=\"n\">pattern<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">.<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"*\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".*\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"?\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".{1}\"<\/span><span class=\"p\">);<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsMatch<\/span><span class=\"p\">(<\/span><span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">,<\/span> <span class=\"n\">pattern<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                        <span class=\"k\">else<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">.<\/span><span class=\"nf\">Equals<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">City<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                    <span class=\"p\">}<\/span>\n\n                    <span class=\"c1\">\/\/Country<\/span>\n                    <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">?.<\/span><span class=\"nf\">Trim<\/span><span class=\"p\">();<\/span>\n                    <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">))<\/span>\n                    <span class=\"p\">{<\/span>\n                        <span class=\"c1\">\/\/in pure Linq going for Regex<\/span>\n                        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'*'<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">.<\/span><span class=\"nf\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">'?'<\/span><span class=\"p\">))<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"kt\">string<\/span> <span class=\"n\">pattern<\/span> <span class=\"p\">=<\/span> <span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">.<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"*\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".*\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">\"?\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\".{1}\"<\/span><span class=\"p\">);<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsMatch<\/span><span class=\"p\">(<\/span><span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">,<\/span> <span class=\"n\">pattern<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                        <span class=\"k\">else<\/span>\n                        <span class=\"p\">{<\/span>\n                            <span class=\"n\">iQueryableOfEmployee<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">.<\/span><span class=\"nf\">Where<\/span><span class=\"p\">(<\/span>\n                                <span class=\"n\">vk<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">vk<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">.<\/span><span class=\"nf\">Equals<\/span><span class=\"p\">(<\/span><span class=\"n\">advancedFilter<\/span><span class=\"p\">.<\/span><span class=\"n\">Country<\/span><span class=\"p\">));<\/span>\n                        <span class=\"p\">}<\/span>\n                    <span class=\"p\">}<\/span>\n                <span class=\"p\">}<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">ex<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"nf\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"p\">.<\/span><span class=\"nf\">ToString<\/span><span class=\"p\">());<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">iQueryableOfEmployee<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>       \n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"6_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  6 \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0645\u0644 \u067e\u0631\u0648\u0698\u0647 \u06a9\u062f \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 GitHub \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0631\u062f [99].<\/p>\n<h2><span class=\"ez-toc-section\" id=\"7_%D9%85%D8%B1%D8%A7%D8%AC%D8%B9\"><\/span>\n<p>  7 \u0645\u0631\u0627\u062c\u0639<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n[1]  https:\/\/datatables.net\/<\/p>\n[99]  https:\/\/github.com\/MarkPelf\/ASPNET8UsingDataTablesNet    <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0639\u0645\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a jQuery DataTables.net \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Asp.Net 8 MVC. \u0686\u06a9\u06cc\u062f\u0647: \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0639\u0645\u0644\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Asp.Net 8 MVC \u06a9\u0647 \u0627\u0632 \u0645\u0648\u0644\u0641\u0647 jQuery DataTables.net \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0627\u062f\u0627\u0645\u0647 \u0645\u0642\u0627\u0644\u0647 Part8 \u0627\u0633\u062a. 1 ASP.NET8 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 jQuery DataTables.net \u0645\u0646 \u0645\u0648\u0644\u0641\u0647 jQuery DataTables.net &hellip;<\/p>\n","protected":false},"author":2,"featured_media":82936,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-82935","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/82935","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=82935"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/82935\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/82936"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=82935"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=82935"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=82935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}