рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╣рдмреНрд░ рдкрд░ рдиреЙрдХрдЖрдЙрдЯ рдЬреЗрдПрд╕ рдХреЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рд╣реИрдВ, рдФрд░ рдореИрдВ рдЗрд╕ рдкреНрд░рд╡реГрддреНрддрд┐ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд░рд╣реВрдВрдЧрд╛ред
рдЖрдЬ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХреЛрдб рдХреЗ рдПрдХ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реБрдП, рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЬрд╛рдХреНрд╕ рдЧреНрд░рд┐рдб рджреГрд╢реНрдп рдмрдирд╛рдирд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрд╛, рдФрд░ рдЕрдм рдпрд╣ рднрд╛рд╡рдирд╛ рджреВрд░ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрд╡рдпрдВ рд╕рд░рд▓ рд╣реИ, рдПрдорд╡реАрд╡реАрдПрдо рдкреИрдЯрд░реНрди рд╕рд░рд▓ рд╣реИ, рдФрд░ рдореИрдВ рд╕рд░рд▓ рдЪреАрдЬреЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдиреЙрдХрдЖрдЙрдЯ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╢рд░реНрдордирд╛рдХ рд╣реИ рдХрд┐ рдПрдХ рдпрд╛ рдПрдХ рд╕рд╛рд▓ рдмрд╛рдж, рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рд╕рд╛рдордЧреНрд░реА рдХреА рд╕рд╛рджрдЧреА рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╕ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреА рддрд░рд╣ рдЬрд┐рд╕рдиреЗ 2007 jQuery рдХрд╛ рд▓реЗрдЦ рдЦреЛрд▓рд╛ред
рдХрдерд┐рдд рдмрдЯрди рд╕рдордЭреМрддреЗ рд╕реЗ рдХреМрди рдбрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЖрдкрд╕реЗ рд╣реИрдмрд░рдХрдЯ рдХреЗ рддрд╣рдд рдкрдХреНрд╖ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдЪрд▓реЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡рд╣ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЛрдЧреЛрдВ (рдирд╛рдо, рд▓рд┐рдВрдЧ, рдЖрдпреБ) рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рджреЗрдВред рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдкреГрд╖реНрда рджрд░ рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдд рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

рд╕рдВрдкреВрд░реНрдг рдмреИрдХрдПрдВрдб рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рджреЗ рджреВрдВрдЧрд╛ред
ActionResult List(FilterParams filterParams, int pageNumber = 1);
ListResult рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд▓реМрдЯрд╛ рд╣реИред рдЗрд╕рдореЗрдВ "рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо" рдФрд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ (рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдХрд┐рддрдиреЗ рдкреГрд╖реНрда рд╣реИрдВ) рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред
рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╕рдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
public class FilterParams { public int? AgeFrom { get; set; } public int? AgeTo { get; set; } public bool ShowMale { get; set; } public bool ShowFemale { get; set; } } public enum Gender { Male, Female } public class PagingData { public int PageNumber { get; set; } public int TotalPagesCount { get; set; } } public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public Gender Gender { get; set; } } public class ListResult { IEnumerable<Person> Data { get; set; } PagingData Paging { get; set; } }
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╢реЛрдз рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдиреЙрдХрдЖрдЙрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ, рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
<script type="text/html" id="TableRow"> <tr> <td data-bind="text: FirstName"></td> <td data-bind="text: LastName"></td> <td data-bind="text: Gender"></td> <td data-bind="text: Age"></td> </tr> </script> <table> <thead> <tr> <th> First name</th> <th> Last name</th> <th> Gender</th> <th> Age</th> </tr> </thead> <tbody data-bind="template: { name: 'TableRow', foreach: rows }"> </tbody> </table>
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд┐рд░ рд╣реЗрдбрд░ рд╣реИ, рдФрд░ tbody рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд░рдгреА рд╕реЗ рдЖрдмрд╛рджреА рд╣реИред рдЕрдм рд╣рдореЗрдВ рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рд╕рдХреЗред рдореИрдВ рдкрд╣рд▓реЗ рдХреЛрдб рджреВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
var viewModel = { rows: ko.observableArray() }; ko.dependentObservable(function () { $.ajax({ url: '/AjaxGrid/List', type: 'POST', context: this, success: function (data) { this.rows(data.Data); } }); }, this); ko.applyBindings(viewModel);
ViewModel рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реАрд▓реНрдб - рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╣ рдЦрд╛рд▓реА рд╣реИред рдлрд┐рд░ рд╣рдо dependObservable рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд░рди рдЯрд╛рдЗрдо рдкрд░, рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ AJAX рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреЗрдУ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░реЗрдЧрд╛ред рдЖрдк
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдпрд╛
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ dependObservable рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛ рдЪрд░рдг рдкреГрд╖реНрда рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЖрдЗрдП viewModel рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
var viewModel = { rows: ko.observableArray(), paging: { PageNumber: ko.observable(1), TotalPagesCount: ko.observable(0), next: function () { var pn = this.PageNumber(); if (pn < this.TotalPagesCount()) { this.PageNumber(pn + 1); } }, back: function () { var pn = this.PageNumber(); if (pn > 1) { this.PageNumber(pn - 1); } } } };
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, MVVM рдкреИрдЯрд░реНрди рдореЗрдВ ViewModel рдХрд╛ рд╕рд╛рд░ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдореЙрдбрд▓ рдореЗрдВ рджреЛ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ,
PageNumber рдФрд░
TotalPagesCount ред рдФрд░ рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдЕрдЧрд▓реЗ () рдФрд░
рдкреАрдЫреЗ () рддрд░реАрдХреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдореЗрдВ
isFirstPage рдпрд╛
isLastPage рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рддреЛ рдЙрдиреНрд╣реЗрдВ рднреА viewModel рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд░рд╛рдЬрд╛ (рдореЙрдбрд▓) рдПрдХ рд╕рд╣рд╛рдпрдХ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд░реЗрдЯрд┐рдиреНрдпреВ (ViewModel) рд╕реЗ рдШрд┐рд░рд╛ рд╣реБрдЖ рд╣реИред
рдкреГрд╖реНрда рд╕реНрд╡рд┐рдЪрд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рддреБрдЪреНрдЫ рд╣реИред
<script type="text/html" id="PagingPanel"> Page <span data-bind="text: PageNumber" /> of <span data-bind="text: TotalPagesCount" />. <br /> <a href="#next" data-bind="click: back"><</a> <a href="#next" data-bind="click: next">></a> </script> <div data-bind="template: { name: 'PagingPanel', data: paging }"></div>
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреМрди рд╕реЗ рдкреГрд╖реНрда рдХрд┐рддрдиреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реИрдВ рдФрд░ рдмрдЯрди рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рд╣реИрдВред рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рджреГрд╢реНрдп рдХреЛ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрдо рд░рд╣рддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рднрд░реЛрд╕реЗрдордВрдж рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
ko.dependentObservable(function () { $.ajax({ url: '/AjaxGrid/List', type: 'POST', data: {pageNumber: this.paging.PageNumber()} context: this, success: function (data) { this.rows(data.Data); } }); }, this);
рд╣рдордиреЗ AJAX рдЕрдиреБрд░реЛрдз рдореЗрдВ PageNumber рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рдЬреЛрдбрд╝рд╛ рд╣реИред рдЕрдм рдиреЙрдХрдЖрдЙрдЯ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ PageNumber () рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде "рдкреБрдирд░рд╛рд╡рд░реНрддреА" рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдЯрди рдХреЛ рдЖрдЧреЗ рджрдмрд╛рддрд╛ рд╣реИ, рддреЛ viewModel рдЗрд╕ рдИрд╡реЗрдВрдЯ (рдбреЗрдЯрд╛-рдмрд╛рдЗрдВрдб = "рдХреНрд▓рд┐рдХ: рдиреЗрдХреНрд╕реНрдЯ") рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдмрд╕ рдкреЗрдЬрдирдВрдмрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╕реЗ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, KO рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдПрдХ PageNumber рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдЖ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ AJAX рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ viewModel.rows рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреВрд░реНрдг рдкреБрдирд░реНрд╡рд┐рдХрд╛рд╕ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
рдЕрдм рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдмрд╛рд░реА рд╣реИред рд╣рдо рдкреЗрдЬ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рднреА рдЦреЛрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реЛрдВрдЧреЗ рдФрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдкрд░ рдЙрдирдХреЗ рдорд╛рди рднреЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗред рдпрд╛рдиреА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╢рд░реНрддреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
var viewModel = { filterParams: { ShowMale: ko.observable(true), ShowFemale: ko.observable(true), AgeFrom: ko.observable(), AgeTo: ko.observable() }, rows: ko.observableArray(), paging: { PageNumber: ko.observable(1), TotalPagesCount: ko.observable(0), next: function () { var pn = this.PageNumber(); if (pn < this.TotalPagesCount()) { this.PageNumber(pn + 1); } }, back: function () { var pn = this.PageNumber(); if (pn > 1) { this.PageNumber(pn - 1); } } } };
рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреИрдирд▓ рджреГрд╢реНрдп:
<script type="text/html" id="FiltrationPanel"> Age from <input type="text" size="3" data-bind="value: AgeFrom" /> to <input type="text" size="3" data-bind="value: AgeTo" /> <br /> <label><input type="checkbox" data-bind="checked: ShowMale" />Show male</label> <br /> <label><input type="checkbox" data-bind="checked: ShowFemale" />Show female</label> </script> <div data-bind="template: { name: 'FiltrationPanel', data: filterParams }"></div>
рдФрд░ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╢реНрд░рд┐рдд рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╣рд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
ko.dependentObservable(function () { var data = ko.utils.unwrapObservable(this.filterParams); // Dependent observable will react only on page number change. data.pageNumber = this.paging.PageNumber(); $.ajax({ url: url, type: 'POST', data: data, context: this, success: function (data) { this.rows(data.Data); this.paging.PageNumber(data.Paging.PageNumber); this.paging.TotalPagesCount(data.Paging.TotalPagesCount); } }); }, this); ko.dependentObservable(function () { var data = ko.toJS(this.filterParams); // Reset page number when any filtration parameters change this.paging.PageNumber(1); }, this);
рдпрд╣рд╛рдВ рдереЛрдбрд╝реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ var data = ko.toJS (this.filterParams); JSP рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░рдкрд░рд╛рдо рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣, рдХрд┐рд╕реА рднреА рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ KO рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рджреВрд╕рд░рд╛ рдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдУрдмреНрд╕реЗрд░реНрд╡реЗрдмрд▓ рднреА рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛ 1 рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд╝рд┐рд▓реНрдЯрд░ рдмрджрд▓рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдЯреНрд░рд╛рдЗрдХрдереНрд░реВ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдиреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╢рд░реНрддреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рджреЛ рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдз рдЖрдПред рдкрд╣рд▓рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ, рджреВрд╕рд░рд╛ рдкреЗрдЬрдирдВрдмрд░ рдХреЛ рдПрдХ рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗред рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд▓рд╛рдЗрди рдХреЛ рдареАрдХ рдХрд┐рдпрд╛
var data = ko.toJS(this.filterParams);
рдкрд░
var data = ko.utils.unwrapObservable(this.filterParams);
рдЗрд╕рдореЗрдВ,
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд , рдЬреЛ
toJS рдкрджреНрдзрддрд┐ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо
рджреЗрдЧрд╛ , рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм
рдлрд┐рд▓реНрдЯрд░рдкреНрд░реЗрдо рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╢рд░реНрддреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ, рд╣рдо рдкреЗрдЬрд┐рдВрдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓ рдЬрд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреЗрдЬрд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкреЗрдЬ 10 рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 5 рд╣реИрдВ)ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛рд░ рд╕реБрдЭрд╛рддрд╛ рд╣реВрдВ рдФрд░ рд╕реЛрдЪрддрд╛ рд╣реВрдВред рд╣рдордиреЗ рдПрдХ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХреАред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ ViewModel рд▓рдЧрднрдЧ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рд╡рд╣ рдХреЗрд╡рд▓ URL рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреА рд╣реИ, рдЬрд╣рд╛рдБ рдбреЗрдЯрд╛ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓рддреЗ рд╣реИрдВред рд╡рд╣ рд╕рдм рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░рдореЙрдбрд▓ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдмрджрд▓ рджреВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ url рдФрд░ рдирд┐рд╕реНрдкрдВрджрдирдкрд░рд╛рдо рддрд░реНрдХ рд╣реИрдВ:
var AjaxGridViewModel = function(url, filterParams) { this.rows= ko.observableArray(); this.filterParams = filterParams; this.paging = { PageNumber: ko.observable(1), TotalPagesCount: ko.observable(0), next: function () { var pn = this.PageNumber(); if (pn < this.TotalPagesCount()) this.PageNumber(pn + 1); }, back: function () { var pn = this.PageNumber(); if (pn > 1) this.PageNumber(pn - 1); } }; ko.dependentObservable(function () { var data = ko.utils.unwrapObservable(this.filterParams);
рдпрд╣ рд╕рдм рдХреЛрдб рдареАрдХ 39 рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╣реИред рдпрджрд┐ рд╣рдо рд╢реАрд░реНрд╖рдХ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
ko.applyBindings(new AjaxGridViewModel('/Ajax/List', { ShowMale: ko.observable(true), ShowFemale: ko.observable(true), AgeFrom: ko.observable(), AgeTo: ko.observable() });
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреВрд╕рд░рд╛ рддрд░реНрдХ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЛ рдЦрд░рд╛рдм рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕реНрд╡рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ C # рдореЗрдВ
рд╡рд░реНрдгрд┐рдд FilterParams рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд╣реИред рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗрд╡рд▓ рджреГрд╢реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ ViewModel рдореЗрдВ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рд╣рдорд╛рд░реЗ ViewModel рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рджрд╛рдврд╝реА рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ ASP.NET MVC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛:
C#: public ActionResult Index() { return View(new FilterParams()); } CSHTML: ko.applyBindings(new AjaxGridViewModel('@Url.Action("List")', @Html.ToJSON(Model)))
рдпрд╣реА рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рджреГрд╢реНрдп рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ, рдФрд░ рджреГрд╢реНрдп рдХреНрд░рдо рдЗрд╕реЗ JS рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдХреЛрдб рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдерд╛рди рдмрдЪрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд╕реНрдкрдВрджрдирдкреИрдиред
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ,
рдирд┐рд╕реНрдкрдВрджрдирдкреНрд░реЗрдо рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрд╡рд▓реЛрдХрдиреАрдп рдореВрд▓реНрдп рдереЗред рдФрд░ рдЕрдм рд╣рдордиреЗ рдЙрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдЦрд┐рд▓рд╛рдпрд╛ред рд╣рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ ko.observable () рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ
ko.mapping рдкреНрд▓рдЧрдЗрди рд╣реИред
рд╣рдо рдЕрдкрдиреЗ AjaxGridViewModel рд╡рд░реНрдЧ рдХреА рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
var AjaxGridViewModel = function(url, filterParams) { this.rows= ko.observableArray(); this.filterParams = ko.mapping.fromJS(filterParams); ...
рдпрд╣ рд╕рдм рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИред
рдФрд░ рдЕрдм рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рдерд╛ рдЬрдм рд╡рд╣рд╛рдБ jqGrid рдФрд░ рдЕрдиреНрдп рд╣реИред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд╕рднреА рд╣реЗрд╡реАрд╡реЗрдЯ рдирд┐рдпрдВрддреНрд░рдг рд╣реИрдВ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рдлреА рд╕рдВрдХреАрд░реНрдг рд░реВрдк рд╕реЗ рд▓рдХреНрд╖рд┐рдд рд╣реИрдВред рдФрд░ рд╣рдордиреЗ рдПрдХ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рджреГрд╢реНрдпрдореЙрдбрд▓ рдФрд░ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рд╣рд▓реНрдХрд╛ рджреГрд╢реНрдп рдмрдирд╛рдпрд╛ред рд╣рдо рддрд╛рд▓рд┐рдХрд╛рдУрдВ, рд╕реВрдЪрд┐рдпреЛрдВ, рдХреБрдЫ рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдХреЛрдб рдФрд░ HTML рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╡рд╣ рд▓рдЪреАрд▓рд╛рдкрди рд╣реИред рд╣рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдкреЗрдЬрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рдорд┐рд▓рд╛ рд╣реИред рдХреЛрдб рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдорд╣рд╛рди, рд╣реИ рдирд╛?
рд▓реЗрдЦ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрдкрдпреЛрдЧреА рдерд╛ред рдХреЛрдИ рднреА рдЗрдЪреНрдЫреБрдХ рд╡реНрдпрдХреНрддрд┐
рдЗрд╕ рд▓рд┐рдВрдХ рд╕реЗ ASP.NET MVC 3 рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдЕрджреНрдпрддрди : рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╢рд░реНрддреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рджреЛ рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред