ASP.NET MVC - ADO.NET рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ MySQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ

рд╡рд┐рд░рд╛рд╕рдд рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА
рдЪреЗрддрд╛рд╡рдиреА: ASP.NET MVC рджреЛрдиреЛрдВ рдкрджрд╛рд╡рдирдд рд╣реИрдВ рдФрд░ ADO.NET рднреАред рдЖрдзреБрдирд┐рдХ ORM рдХреЗ рд╕рд╛рде ASP.NET рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкрдврд╝реЗрдВред

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА, рд╢рд╛рдпрдж, рддреАрди рдмрд╛рд░ рдореИрдВ ASP.NET MVC рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред ASP.NET WebForms рдХреЗ рд╕рд╛рде рджрд╕ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, MVC рддрдХрдиреАрдХ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдВрддрд░ рд╣реИрдВ рдЬреЛ рдпрд╣ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрди рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╛рдирддрд╛ рд╣реИ - .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЫреЛрдбрд╝рдХрд░ред рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ - рдПрдорд╡реАрд╕реА рд╡реЗрдмрдлрд╛рд░реНрдо рд╕реЗ рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рд╣реИ, рд╡реЗ рджреЛрдиреЛрдВ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рджреЛрдиреЛрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рд╕рд╛рде рдЯреАрдбреАрдбреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рднреА рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИред

рдФрд░ рдЕрдм рдореИрдВ рд╕рдмрд╕реЗ рдорд╛рдирдХ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ - рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп: рд╕рд╛рд░рдгреАрдмрджреНрдз рд░реВрдк рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдирд╛ (рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдмрджрд▓рдирд╛) рдХреА рд╕реВрдЪреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдЧрднрдЧ рд╕рднреА рдкреБрд╕реНрддрдХреЛрдВ рдФрд░ ASP.NET MVC рдХреЗ рд▓рд┐рдП рдХрдИ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ORM (рдСрдмреНрдЬреЗрдХреНрдЯ рд░рд┐рд▓реЗрд╢рди рдореИрдкрд┐рдВрдЧ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: SQL рдХреЗ рд▓рд┐рдП рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ (EF) рдпрд╛ LINQред рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ, рдЕрдВрдд рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреАрдмреАрдПрдордПрд╕ (рдЬреЛ рд╡рд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдЖрдорддреМрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрд╕рдХреНрдпреВрдПрд▓, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ: рдИрдПрдл рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рдЫрд╛рдиреЗ DBMS рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рдордЭреЗрдВрдЧреЗред "рдпрд╣рд╛рдБ рдпрд╣ рдЦреБрд╢реА рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕реМрдВрджрд░реНрдп рдирд╣реАрдВ рд╣реИред" рд▓реЗрдХрд┐рди рдЙрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЬреЛ ADO.NET рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рдЕрдХреНрд╕рд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ ASP.NET MVC рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╣ рдЧреНрд░рд┐рдб рдЯреЗрдмрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдШрдЯрдХ рдХреА рдХрдореА рдкрд░ рдЬрдВрдЧрд▓реА рдЯреВрдЯрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реНрд╡рдпрдВ рдпрд╣ рд╕рдм рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХ рд╕реЗ рдХреБрдЫ рдЙрдкрдпреБрдХреНрдд рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк, рдореЗрд░реА рддрд░рд╣, ASP.NET WebForms рдореЗрдВ GridView рдШрдЯрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЦреБрд╢ рдереЗ, рддреЛ MVC рдХреЗ рд▓рд┐рдП, Grid.mvc рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХреБрдЫ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рддреБрд▓рдиреАрдп рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕ рдШрдЯрдХ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ (рдХреНрдпрд╛ рдпрд╣ рдЧреБрдгрд╛рддреНрдордХ рд╣реИ?), рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдм рдФрд░ рдХреИрд╕реЗ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХрднреА-рдХрднреА рдШрдЯрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдбреЗрд╡рд▓рдкрд░ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрджрдиреЗ рдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдШрдЯрдХ рдЕрдкрдбреЗрдЯ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рднреЗрджреНрдпрддрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ MySQL рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдПрдХ рдмрдбрд╝реА рдХрдВрдкрдиреА рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреБрдЧреЗрдЯ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдореЗрдВ рдХрдИ "рдмрд╛рдЗрдХ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?

рдЗрд╕рд▓рд┐рдП, MySQL DBMS рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, ASP.NET MVC рдХреЗ рддрд╣рдд рд▓рд┐рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЗрд╕ рдкрддреЗ рдкрд░ рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдВ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдиреАрдЪреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдЫреЛрдЯреЗ рд▓рд┐рдВрдХ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдпрд╣рд╛рдВ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

MySQL рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдБ


CREATE SCHEMA `example`; USE `example`; CREATE TABLE `users` ( `UserID` int(4) unsigned NOT NULL AUTO_INCREMENT, `SupporterTier` enum('None','Silver','Gold','Platinum') NOT NULL DEFAULT 'None', `Loginname` varchar(255) NOT NULL, `LanguageID` int(4) unsigned NOT NULL DEFAULT '2', `Email` varchar(255) DEFAULT NULL, `LastLoginDate` datetime DEFAULT NULL, PRIMARY KEY (`UserID`), KEY `i_Loginname` (`Loginname`), KEY `i_Language_idx` (`LanguageID`), CONSTRAINT `i_Language` FOREIGN KEY (`LanguageID`) REFERENCES `languages` (`LanguageID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE `languages` ( `LanguageID` int(4) unsigned NOT NULL AUTO_INCREMENT, `LanguageName` varchar(50) NOT NULL DEFAULT '', `Culture` varchar(10) DEFAULT NULL, PRIMARY KEY (`LanguageID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

рдбреЗрдЯрд╛рдмреЗрд╕ (DB) рд╕рд░рд▓ рдФрд░ рдХреЗрд╡рд▓ рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рдирдХреЗ рд╕рд╛рде LanguageID рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдз рд╣реЛрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо SupporterTier рдХреНрд╖реЗрддреНрд░ рднреА рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдПрдирдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдорд░реНрдерди рдХреЗ рд╕реНрддрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдФрд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо тАЬрджрд┐рдирд╛рдВрдХ / рд╕рдордптАЭ рдкреНрд░рдХрд╛рд░ рдХреЗ LastLoginDate рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╣реА рднрд░рд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ




"MVC" рдЪреБрдиреЗрдВред "рдЦрд╛рд▓реА" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛, рддреБрд░рдВрдд рдорджрдж рдХрд░реЗрдЧрд╛, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдФрд░ JQuery рдХреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░реЗрдЧрд╛ред



рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд░реЗ рд╣реБрдП рдХрдВрдЯреЗрдВрдЯ , рдлреЛрдВрдЯ , рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рдлреЛрд▓реНрдбрд░, рд╕рд╛рде рд╣реА рд╕рд╛рде ASP.NET MVC рдмрдВрдбрд▓реЛрдВ рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдкрдВрдЬреАрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде App_Start рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ FilesConfig.cs рдФрд░ FilterConfig.cs рдлрд╛рдЗрд▓реЗрдВ рднрд░реА рд╣реБрдИ рд╣реИрдВ ред рдХрд┐рд╕реА рд░рд┐рдХреНрдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд░реВрдЯрдХреЙрдиреНрдлрд╝рд┐рдЧ.рдПрдХреНрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред Global.asax.cs рдореЗрдВ, рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛:

 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); 

рд╣рдордиреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдФрд░ рдкреВрд░реЗ рдмрдВрдбрд▓ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА


MySQL DBMS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MySql.Data рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВ: рдпрд╛ рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ, рдЕрдЧрд░ mysql-рдХрдиреЗрдХреНрдЯрд░-net-8.0.18 рдХрдиреЗрдХреНрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдпрд╛ Nuget рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рд╕реЗ:



рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ Web.config рдлрд╝рд╛рдЗрд▓ рдореЗрдВ MySQL DBMS рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 <connectionStrings> <add name="example" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;Port=3306;user id=develop;Password=develop;persistsecurityinfo=True;database=example;CharSet=utf8;SslMode=none" /> </connectionStrings> 

рдЬреЛрдбрд╝реЗ рдЧрдП рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде <appSettings> рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ: <add key="ConnectionString" value="example" />
рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдирдИ рдбреЛрдореЗрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рд╣рдо рдПрдХ рдирдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ Base рдХреНрд▓рд╛рд╕ ( рдмреЗрд╕.рдПрд╕рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ) рдмрдирд╛рддреЗ рд╣реИрдВ , рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ:

 public static class Base { private static string ConnectionString { get { return System.Configuration.ConfigurationManager.AppSettings["ConnectionString"]; } } public static string strConnect { get { return System.Configuration.ConfigurationManager.ConnectionStrings[ConnectionString].ConnectionString; } } } 

рдореИрдВ рдЖрд╡реЗрджрди рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдХреБрдЫ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдкреВрд░реЗ рдЖрд╡реЗрджрди рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд╛рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ DBMS рдХреЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдП: рдЬрд▓реНрджреА рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ рдФрд░ рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Microsoft Azure рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ - рд╡рд╣рд╛рдВ рдЖрдк рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ <connectionStrings> рдореЗрдВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рдлрд┐рд░, рдЬрдм рдкреНрд░рдХрд╛рд╢рди, рдЖрдк web.config рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдореБрдЭреЗ рдкрд╛рда рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:



рдкреГрд╖реНрда рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ _Layout.cshtml (рдпрд╣ рдорд╛рдирдХ рд░реВрдк рд╕реЗ рджреГрд╢реНрдп \ рд╕рд╛рдЭрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЕрдм рдЖрдк рдЗрди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Example_Users.Properties.Resources.Title рджреЗрдЦреЗрдВред Example_Users.Properties.Resources.Title ):

 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title тАУ @Example_Users.Properties.Resources.Title</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> <div class="container body-content"> <h1 class="page-header"><a href="/">@Example_Users.Properties.Resources.Title</a></h1> @RenderBody() <hr /> <footer> <p> @DateTime.Now.Year тАУ @Example_Users.Properties.Resources.Author</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html> 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рд╣рдореЗрдВ рдХрдиреЗрдХреНрдЯреЗрдб рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдФрд░ JQuery рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХреИрд╕реНрдХреЗрдбрд┐рдВрдЧ рд╕реНрдЯрд╛рдЗрд▓ рд╢реАрдЯ рдХрд╛ рд▓рдЧрд╛рд╡ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдХреЙрд▓ RenderBody() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕рднреА рджреГрд╢реНрдпреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рдПрдЧреАред

рдПрдо рдХрд╛ рдорддрд▓рдм рдореЙрдбрд▓ рд╣реИ


рдбреЛрдореЗрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ UserClass.cs рдЬреЛрдбрд╝реЗрдВ:

 [DisplayName("User")] public class UserClass { [Key] [HiddenInput(DisplayValue=false)] public int UserID { get; set; } [Required(ErrorMessage="Please enter a login name")] [Display(Name = "Login")] public string Loginname { get; set; } public virtual LanguageClass Language { get; set; } [EmailAddress(ErrorMessage = "Please enter a valid email")] public string Email { get; set; } [UIHint("Enum")] [EnumDataType(typeof(Supporter))] [Required(ErrorMessage = "Please select supporter tier")] [Display(Name = "Supporter")] public Supporter SupporterTier { get; set; } [HiddenInput(DisplayValue = true)] [ScaffoldColumn(false)] [Display(Name = "Last login")] public DateTime? LastLoginDate { get; set; } [HiddenInput(DisplayValue = false)] public bool IsLastLogin { get { return LastLoginDate != null && LastLoginDate > DateTime.MinValue; } } public UserClass() {} public UserClass(int UserID, string Loginname, LanguageClass Language, string Email, DateTime? LastLoginDate, Supporter SupporterTier) { this.UserID = UserID; this.Loginname = Loginname; this.Language = Language; this.Email = Email; this.LastLoginDate = LastLoginDate; this.SupporterTier = SupporterTier; } } public enum Supporter { [Display(Name="")] None = 1, Silver = 2, Gold = 3, Platinum = 4 } 

рдФрд░ рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ LanguageClass.cs рдлрд╝рд╛рдЗрд▓ рднреА:
 [DisplayName("Language")] public class LanguageClass { [Key] [HiddenInput(DisplayValue = false)] [Required(ErrorMessage = "Please select a language")] [Range(1, int.MaxValue, ErrorMessage = "Please select a language")] public int LanguageID { get; set; } [Display(Name = "Language")] public string LanguageName { get; set; } public LanguageClass() {} public LanguageClass(int LanguageID, string LanguageName) { this.LanguageID = LanguageID; this.LanguageName = LanguageName; } } 

рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЧреБрдг DBMS рдореЗрдВ Users рдФрд░ Languages рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред рдЧрдгрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ enum Supporter рдмрдирд╛рдпрд╛ enum Supporter рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдмрд▓ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░ рдХреЗ SupporterTier рд╡рд░реНрдЧ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред UserID , LanguageID рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рддрд░рд╣ рд╣реА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВред [Key] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдиреНрдп рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рд╣рдо рдЗрди рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП HTML рдЯреИрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдЬреЛ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рдКрдВрдЧрд╛), рддреЛ рд╣рдореЗрдВ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдБ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛:

  • [DisplayName] - рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП Html.DisplayNameForModel рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝рд╛ред
  • Name рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде [Display] - рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╡рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЙрдкрдпреЛрдЧреА рдСрд░реНрдбрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рднреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рд╣рд╛рдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдСрд░реНрдбрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХреНрд▓рд╛рд╕ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • [HiddenInput] DisplayValue рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рдеред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╛ рддреЛ рд╕рднреА рд░реВрдкреЛрдВ рдФрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ ( DisplayValue=false , hidden рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде input рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИрдВ), рдпрд╛ рдЙрди рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЕрднреА рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрд╛рда ( DisplayValue=true , рддреИрдпрд╛рд░ рдХреА рдЧрдИ рд╣реИред рд╕реНрд╡рдЪреНрдЫ рдкрд╛рда рдХреА рддрд░рд╣, рдЯреИрдЧ рдХреЗ рдмрд┐рдирд╛)
  • [ScaffoldColumn] - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдкрд╛рджрди Html.EditorForModel рдореЗрдВ рдлрд╝реАрд▓реНрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Html.EditorForModel )ред рдпрджрд┐ false , рддреЛ рди рддреЛ рд╡рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рди рд╣реА рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдлреЙрд░реНрдо рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред [HiddenInput(DisplayValue = false)] рдЙрдкрдпреЛрдЧ [HiddenInput(DisplayValue = false)] рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ [HiddenInput(DisplayValue = false)] , рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рди рдХреЗрд╡рд▓ рд╕реВрдЪрдирд╛ рдЗрдирдкреБрдЯ рд░реВрдкреЛрдВ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдЯреЗрдмрд▓ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, LastLoginDate рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬрд┐рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • [Required] - рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореВрд▓реНрдп рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрд░рд░ AllowEmptyStrings рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдПрд░рд░ рдореИрд╕реЗрдЬ рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ AllowEmptyStrings рдкреНрд░реЙрдкрд░реНрдЯреА AllowEmptyStrings рдЖрдкрдХреЛ рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • [EmailAddress] - рдбрд╛рдХ рдкрддреЗ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдбреЗрдЯрд╛рдмреЗрд╕ рдореЙрдбрд▓ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рддреИрдпрд╛рд░ рд╣реИрдВ, рд╣рдо рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреА рдУрд░ рд░реБрдЦ рдХрд░рддреЗ рд╣реИрдВ (рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓реЛрдВ рдХреЗ рд╡рд░реНрдЧ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ)ред

рд╡реА - рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреНрд░рддрд┐рд╢реЛрдз рдкреНрд░рджрд░реНрд╢рди


рджреГрд╢реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВред рд╣рдорд╛рд░реЗ рд╕рднреА рджреГрд╢реНрдп рдорд╛рдирдХ ( рджреГрд╢реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ _ViewStart.cshtml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рджреГрд╢реНрдп \ рд╕рд╛рдЭрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд _Layout.cshtml рд▓реЗрдЖрдЙрдЯред рдПрдХ Index рджреГрд╢реНрдп ( рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ Index.cshtml рдлрд╝рд╛рдЗрд▓) рдмрдирд╛рдПрдБ:



рдФрд░ рдХреЛрдб рд▓рд┐рдЦреЗрдВ:

 @model Example_Users.Models.UsersGrid @{ ViewBag.Title = "Users page"; } @using (@Html.BeginForm()) { <div> <h3>Users list:</h3> @if (TempData["message"] != null) {<div class="text-success">@TempData["message"]</div>} @if (TempData["error"] != null) {<div class="text-warning"><span class="alert">ERROR:</span> @TempData["error"]</div>} @Html.Partial("List") <p> <input type="submit" name="onNewUser" value="New user" /> @*@Html.ActionLink("New user", "New", "Users")*@ </p> </div> } 

рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рджреГрд╢реНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рд╣реЛ, рддреЛ рдорд╛рд░реНрдЧ рдореЗрдВ Default рд╕реЗ рдПрдХ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ редConfig.cs рдлрд╝рд╛рдЗрд▓:

 routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Users", action = "Index", id = UrlParameter.Optional }); 

рджреГрд╢реНрдп рдореЗрдВ рд╣реА, рдЖрдкрдХреЛ Html.Partial("List") рд╕рд╛рде рд▓рд╛рдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдЬрдЧрд╣ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрд▓рдЧ рд╕рд╛рдорд╛рдиреНрдп рдЖрдВрд╢рд┐рдХ рджреГрд╢реНрдп рд╡реНрдпреВ.рд╢рд░реНрдб рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд▓рд┐рд╕реНрдЯ.рд╕реА.рдЯреАрдЯреАрдПрдордПрд▓ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ users рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд┐рдб рддрд╛рд▓рд┐рдХрд╛ рд╣реИ:

 @model Example_Users.Models.UsersGrid @using Example_Users.Domain <div class="table-responsive"> <table class="table table-bordered table-hover"> <thead> <tr> <th>@Html.ActionLink(Html.DisplayNameFor(m => Model.Users.First().Loginname).ToString(), "Index", Request.QueryString.ToRouteValueDictionary("sortOrder", Model.SortingInfo.NewOrder(Html.NameFor(m => Model.Users.First().Loginname).ToString()))) @Html.SortIdentifier(Model.SortingInfo.currentSort, Html.NameFor(m => Model.Users.First().Loginname).ToString()) </th> <th>@Html.ActionLink(Html.DisplayNameFor(m => Model.Users.First().Language.LanguageName).ToString(), "Index", Request.QueryString.ToRouteValueDictionary("sortOrder", Model.SortingInfo.NewOrder(Html.NameFor(m => Model.Users.First().Language).ToString()))) @Html.SortIdentifier(Model.SortingInfo.currentSort, Html.NameFor(m => Model.Users.First().Language).ToString()) </th> <th>@Html.ActionLink(Html.DisplayNameFor(m => Model.Users.First().Email).ToString(), "Index", Request.QueryString.ToRouteValueDictionary("sortOrder", Model.SortingInfo.NewOrder(Html.NameFor(m => Model.Users.First().Email).ToString()))) @Html.SortIdentifier(Model.SortingInfo.currentSort, Html.NameFor(m => Model.Users.First().Email).ToString()) </th> <th>@Html.ActionLink(Html.DisplayNameFor(m => Model.Users.First().SupporterTier).ToString(), "Index", Request.QueryString.ToRouteValueDictionary("sortOrder", Model.SortingInfo.NewOrder(Html.NameFor(m => Model.Users.First().SupporterTier).ToString()))) @Html.SortIdentifier(Model.SortingInfo.currentSort, Html.NameFor(m => Model.Users.First().SupporterTier).ToString()) </th> <th>@Html.ActionLink(Html.DisplayNameFor(m => Model.Users.First().LastLoginDate).ToString(), "Index", Request.QueryString.ToRouteValueDictionary("sortOrder", Model.SortingInfo.NewOrder(Html.NameFor(m => Model.Users.First().LastLoginDate).ToString()))) @Html.SortIdentifier(Model.SortingInfo.currentSort, Html.NameFor(m => Model.Users.First().LastLoginDate).ToString()) </th> </tr> </thead> <tbody> @foreach (var item in Model.Users) { <tr> <td>@Html.ActionLink(item.Loginname, "Edit", "Users", new { UserID = item.UserID }, null)</td> <td>@Html.DisplayFor(modelitem => item.Language.LanguageName)</td> <td>@Html.DisplayFor(modelitem => item.Email)</td> <td class="@Html.DisplayFor(modelitem => item.SupporterTier)">@if (item.SupporterTier != Supporter.None) {@Html.DisplayFor(modelitem => item.SupporterTier);}</td> <td>@if (item.IsLastLogin) {@Html.DisplayFor(modelitem => item.LastLoginDate)}</td> </tr> } </tbody> </table> </div> @if (Model.PagingInfo.totalPages > 1) { <ul class="pagination"> @Html.PageLinks(Model.PagingInfo, x => Url.Action("Index", new { page = x, sortOrder = Model.SortingInfo.currentSort })) </ul> } 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЯреЗрдмрд▓ рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ, рд╕реНрддрдВрднреЛрдВ рдХреЗ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Html.DisplayNameFor рдХрд╛ Html.DisplayNameFor рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдЯреЗрдмрд▓ рдЯрд╛рдЗрдЯрд▓ рдмрдирд╛рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ Model.Users рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ UserClass рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: UserClass рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рд╕реВрдЪреА рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд▓рд┐рдП: Model.Users.First().Loginname ред рдЪреВрдВрдХрд┐ Users рд╡рд░реНрдЧ рдХреА Loginname рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ [Display(Name = "Login")] рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдпрд╣ рдХреЙрд▓рдо рдирд╛рдо рдореЗрдВ "рд▓реЙрдЧрд┐рди" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:



List рджреГрд╢реНрдп рдореЗрдВ рдФрд░ рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ? UserClass рдмреНрд▓реЙрдХ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, Users рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд Users рд╕реВрдЪреА рдореЗрдВ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ UsersGrid рдореЙрдбрд▓ рдореЗрдВ SortingInfo рдФрд░ PagingInfo рдпрд╣рд╛рдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред рдФрд░ рд╣рдореЗрдВ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдбреЗрдЯрд╛ рд╕реЙрд░реНрдЯрд┐рдВрдЧ (рддрд╛рд▓рд┐рдХрд╛ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд <th> рдЯреИрдЧреНрд╕) рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реВрдЪрдирд╛ рдХреЗ рдкреГрд╖реНрдард╛рдВрдХрди (рдкреЗрдЬ рдХреЗ рдиреАрдЪреЗ, рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдиреАрдЪреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реАрд▓рд┐рдП рд╣рдо рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ IEnumerable<UserClass> рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╢реБрджреНрдз рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо UsersGrid рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ ModelGrid.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

 public class UsersGrid { public IEnumerable<UserClass> Users { get; set; } public PagingInfo PagingInfo { get; set; } public SortingInfo SortingInfo { get; set; } } 

рдФрд░ PagingInfo рдФрд░ SortingInfo рдЦреБрдж рдХреЛ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ GridInfo.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ GridInfo.cs рдХрд░рддрд╛ рд╣реИред

 public class PagingInfo { //     public int totalItems { get; set; } //     public int itemsPerPage { get; set; } //   public int currentPage { get; set; } //         public int showPages { get; set; } //   public int totalPages { get { return (int)Math.Ceiling((decimal)totalItems / itemsPerPage); } } //           public int pagesSide { get { return (int)Math.Truncate((decimal)showPages / 2); } } } public class SortingInfo { //  ,     public string currentOrder { get; set; } //   public SortDirection currentDirection { get; set; } //      public string currentSort { get { return currentDirection != SortDirection.Descending ? currentOrder : currentOrder + "_desc"; } } //       (      -   ) public string NewOrder(string columnName) { return columnName == currentOrder && currentDirection != SortDirection.Descending ? columnName + "_desc" : columnName; } } 

рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ GridHelpers.cs рдлрд╝рд╛рдЗрд▓ ( HtmlHelpers рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:

 public static class GridHelpers { //     1 ... 3 4 5 ... Last public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int, string> pageUrl) { StringBuilder result = new StringBuilder(); if (pagingInfo.currentPage > pagingInfo.pagesSide + 1) {//   TagBuilder li = new TagBuilder("li"); li.AddCssClass("page-item"); TagBuilder tag = new TagBuilder("a"); tag.MergeAttribute("href", pageUrl(1)); tag.InnerHtml = "1"; li.InnerHtml = tag.ToString(); result.Append(li.ToString()); } int page1 = pagingInfo.currentPage - pagingInfo.pagesSide; int page2 = pagingInfo.currentPage + pagingInfo.pagesSide; if (page1 < 1) { page2 = page2 - page1 + 1; page1 = 1; } if (page2 > pagingInfo.totalPages) page2 = pagingInfo.totalPages; if (page1 > 2) {// ... TagBuilder li = new TagBuilder("li"); li.AddCssClass("page-item"); TagBuilder tag = new TagBuilder("span"); tag.InnerHtml = "..."; tag.AddCssClass("page-item"); tag.AddCssClass("disabled"); li.InnerHtml = tag.ToString(); result.Append(li.ToString()); } for (int i = page1; i <= page2; i++) {//  TagBuilder li = new TagBuilder("li"); li.AddCssClass("page-item"); if (i == pagingInfo.currentPage) li.AddCssClass("active"); TagBuilder tag = new TagBuilder("a"); tag.AddCssClass("page-link"); tag.MergeAttribute("href", pageUrl(i)); tag.InnerHtml = i.ToString(); li.InnerHtml = tag.ToString(); result.Append(li.ToString()); } if (page2 < pagingInfo.totalPages) {// ...    TagBuilder li = new TagBuilder("li"); li.AddCssClass("page-item"); TagBuilder tag = new TagBuilder("span"); tag.InnerHtml = "..."; tag.AddCssClass("page-item"); tag.AddCssClass("disabled"); li.InnerHtml = tag.ToString(); result.Append(li.ToString()); li = new TagBuilder("li"); li.AddCssClass("page-item"); tag = new TagBuilder("a"); tag.MergeAttribute("href", pageUrl(pagingInfo.totalPages)); tag.InnerHtml = pagingInfo.totalPages.ToString(); li.InnerHtml = tag.ToString(); result.Append(li.ToString()); } return MvcHtmlString.Create(result.ToString()); } public static IHtmlString SortIdentifier(this HtmlHelper htmlHelper, string sortOrder, string field) { if (string.IsNullOrEmpty(sortOrder) || (sortOrder.Trim() != field && sortOrder.Replace("_desc", "").Trim() != field)) return null; string glyph = "glyphicon glyphicon-chevron-up"; if (sortOrder.ToLower().Contains("desc")) { glyph = "glyphicon glyphicon-chevron-down"; } var span = new TagBuilder("span"); span.Attributes["class"] = glyph; return MvcHtmlString.Create(span.ToString()); } public static RouteValueDictionary ToRouteValueDictionary(this NameValueCollection collection, string newKey, string newValue) { var routeValueDictionary = new RouteValueDictionary(); foreach (var key in collection.AllKeys) { if (key == null) continue; if (routeValueDictionary.ContainsKey(key)) routeValueDictionary.Remove(key); routeValueDictionary.Add(key, collection[key]); } if (string.IsNullOrEmpty(newValue)) { routeValueDictionary.Remove(newKey); } else { if (routeValueDictionary.ContainsKey(newKey)) routeValueDictionary.Remove(newKey); routeValueDictionary.Add(newKey, newValue); } return routeValueDictionary; } } 

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



рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ



рдФрд░ рд╡реНрдпреВ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 @model Example_Users.Models.UserModel @{ ViewBag.Title = "New " + Html.DisplayNameForModel().ToString().ToLower(); } <h2>@ViewBag.Title</h2> @using (@Html.BeginForm("New", "Users", FormMethod.Post)) { @Html.EditorFor(m => m.User); @Html.LabelFor(m => Model.User.Language)<br /> @Html.DropDownListFor(m => Model.User.Language.LanguageID, Model.SelectLanguages()) <span/>@Html.ValidationMessageFor(m => Model.User.Language.LanguageID)<br /> <br /> <p><input type="submit" name="action" value="Add" /> <input type="button" onclick="history.go(-1)" value="Cancel" /></p> @*<p>@Html.ActionLink("Back to list", "Index")</p>*@ } 

рдпрд╣ рджреГрд╢реНрдп рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UserClass рд╡рд░реНрдЧ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ Html.EditorFor рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧред рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



рдпрд╣ рджреГрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ UserModel рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдирд╛ рдХрд┐ рд╕реАрдзреЗ UserClass ред UserModel рд╡рд░реНрдЧ рд╕реНрд╡рдпрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ UserModel.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ:

 public class UserModel { public UserClass User { get; set; } private IList<LanguageClass> Languages { get; set; } public UserModel() {} public UserModel(UserClass user, IList<LanguageClass> languages) { this.User = user; this.Languages = languages; } public IEnumerable<SelectListItem> SelectLanguages() { if (Languages != null) { return new SelectList(Languages, "LanguageID", "LanguageName"); } return null; } } 

UserClass рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реА рдФрд░ UserClass рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдЪреА рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ LanguageClass ред рд╣рдореЗрдВ рднрд╛рд╖рд╛рдУрдВ рдХреА рдПрдХ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: @Html.DropDownListFor(m => Model.User.Language.LanguageID, Model.SelectLanguages(), "")

рдпрд╣ рд╕рд╣рд╛рдпрдХ рдХреЙрд▓ рдХреЛ SelectLanguages() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рднрд╛рд╖рд╛ рдХреА рд╕реВрдЪреА рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рд▓рд╛рдЗрди рдирд╛рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде SelectList рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ SelectList ред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкреАрдврд╝реА рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рд░рдЦрдирд╛ рдЧрд▓рдд рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ред SelectList , рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╕реАрдзреЗ рддреИрдпрд╛рд░ SelectList рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдбреЛрдореЗрди рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдирд┐рдЬреА рд╕реВрдЪреА рдФрд░ рдЕрдзрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рд╣реИред

рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ Html.EditorFor(m => m.User) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ Html.EditorFor(m => m.User) рд╣реЗрд▓реНрдкрд░ рдЯрд╛рдЗрдк LanguageClass рдХреА рдПрдореНрдмреЗрдбреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдбрд┐рдЯрд┐рдВрдЧ рдорд╛рд░реНрдХрдЕрдк рдирд╣реАрдВ Html.EditorFor(m => m.User) (рдпрд╣ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдХрд░ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рд╣реИрдВред рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ ...)ред

рдФрд░ рдЬрдм рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ UserModel рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ UserClass рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рд╣рдо Html.EditorForModel() рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╣рд╛рдпрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП Html.EditorFor() рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Html.EditorFor() User рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд┐рдП рдЧрдП рдЯреИрдЧ Html.ActionLink("Back to list", "Index")

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

рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг UserClass:



рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдб:

 @model Example_Users.Models.UserModel @{ ViewBag.Title = "Edit " + Html.DisplayNameForModel().ToString().ToLower(); } <h2>@ViewBag.Title @Model.User.Loginname</h2> @using (@Html.BeginForm("Edit", "Users", FormMethod.Post)) { @Html.HiddenFor(m => Model.User.UserID) <div> @Html.LabelFor(m => Model.User.Loginname) @Html.EditorFor(m => Model.User.Loginname) @Html.ValidationMessageFor(m => Model.User.Loginname) </div> <div> @Html.LabelFor(m => Model.User.Language) @Html.DropDownListFor(m => Model.User.Language.LanguageID, Model.SelectLanguages()) @Html.ValidationMessageFor(m => Model.User.Language.LanguageID) </div> <div> @Html.LabelFor(m => Model.User.Email) @Html.EditorFor(m => Model.User.Email) @Html.ValidationMessageFor(m => Model.User.Email) </div> <div> @Html.LabelFor(m => Model.User.SupporterTier) @Html.EditorFor(m => Model.User.SupporterTier) @*@Html.EnumDropDownListFor(m => Model.User.SupporterTier)*@ @*@Html.DropDownListFor(m => m.Model.User.SupporterTier, new SelectList(Enum.GetNames(typeof(Example_Users.Domain.Supporter))))*@ @Html.ValidationMessageFor(m => Model.User.SupporterTier) </div> <br /> <p><input type="submit" name="action" value="Save" /> <input type="submit" name="action" value="Remove" onclick="javascript:return confirm('Are you sure?');" /> <input type="submit" name="action" value="Cancel" /></p> } 

рдФрд░ рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ, рдХрд┐рд╕реА рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдЯреИрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╣реЗрд▓реНрдкрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ, рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



рдФрд░ рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ, рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬреИрд╕реЗ: />рдЙрд╕реА рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛ рдмрдЯрди ( рд╕рд╣реЗрдЬреЗрдВ , рдирд┐рдХрд╛рд▓реЗрдВ ) рдХреЗ рд░реВрдк />рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ : рдФрд░ рд░рд┐рдЯрд░реНрди рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрди рдмрдЯрди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдиреАрдЪреЗ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВ)ред

enum


рдФрд░ рддрдм рдПрдХ рд╡рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рдереА ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ Html.EditorFor(), рддреЛ рдкрд╛рда рд╕реВрдЪрдирд╛ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб (рдЯрд╛рдЗрдк рдЯреИрдЧ <input type=тАЭtextтАЭ/>) рдХреЛ рдлреЙрд░реНрдо рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ , рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдпрд╛рдиреА <select>рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдЧ <option>)ред

1. rectilinearly рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Html.DropDownListFor()рдпрд╛ Html.ListBoxFor(), рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП @Html.DropDownListFor(m => m.Model.User.SupporterTier, new SelectList(Enum.GetNames(typeof(Example_Users.Domain.Supporter))))ред рджреЛ рдореАрдиреВ рд╣реИрдВ - рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЗрд╕реЗ рд╕рд╣рд╛рдпрдХ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ Html.EditorForModel()рдпрд╛ Html.EditorFor()рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

2. рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдЯрд╛рдЗрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ Editorред Views \ Shared \ EditorTemplates рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ Supporter.cshtml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ :

 @model Example_Users.Domain.Supporter @Html.DropDownListFor(m => m, new SelectList(Enum.GetNames(Model.GetType()), Model.ToString())) 

рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдЯрд╛рдЗрдк рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ Html.EditorFor(m => Model.SupporterTier), рд▓реЗрдХрд┐рди Html.EditorFor(m => Model.SupporterTier, "Supporter")ред рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрд▓рдЧ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рдВрдХреЗрдд рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ [UIHint("Supporter")]ред рдФрд░ рдпрд╣ рднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ Html.EditorForModel()- рдЗрд╕рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдХрд╛ рд╕рдорд╛рдзрд╛рди Html.EditorFor(m => Model.SupporterTier, "Supporter")рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐, рдЬрдм рдЖрдк рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рд╢реБрд░реВ рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реЗ рдирд╣реАрдВ рдЖрдпрд╛ рдерд╛ Newрд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рд▓рд┐рдП) рдХрд╛рд░реНрдпрдХреНрд░рдо Html.EditorFor()рдФрд░ Html.EditorForModel()рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдЧрд┐рд░ рдЧрдИ: " рддрддреНрд╡ рдореЙрдбрд▓ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рд╢реВрдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░┬л Example_Users рдореЙрдбрд▓ред Domain.Supporter ", рдЕрд╢рдХреНрдд рдирд╣реАрдВред┬╗рдХрд╛рд░рдг рд╕реНрдкрд╖реНрдЯ рд╣реИ - рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рди рд░рд┐рдХреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╡рд╣ рдЖрдЧреЗ рд╕рдордЭрдиреЗ рд▓рдЧрд╛ред

3. рдЖрдк Html.EnumDropDownListFor()рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдХреБрдЫ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рдВрдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдХ "рд▓реЗрдХрд┐рди" рдХреЛ рдЫреЛрдбрд╝рдХрд░: рд╕рд╣рд╛рдпрдХ Html.EditorForModel()рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ Html.EditorFor()рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ Html.EnumDropDownListFor()ред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ, рдпрд╣ рдЧреБрдг рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЧреБрдг рдХреА рдорджрдж рд╕реЗ рдмрдЪрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - [UIHint], [DataType]рдФрд░ [EnumDataType]рдЙрд╕рдХреЗ рдмрд╛рдж рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреА, рдЕрд░реНрдерд╛рддреН, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЧрдгрдирд╛ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИSupporterред

4. рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЖрдпрд╛ : рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдирд╛ред рджреГрд╢реНрдп \ рд╕рд╛рдЭрд╛ \ EditorTemplates рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ Enum.cshtml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ :

 @using System.ComponentModel.DataAnnotations @model Enum @{ Func<object, string> GetDisplayName = o => { var result = null as string; var display = o.GetType() .GetMember(o.ToString()).First() .GetCustomAttributes(false) .OfType<DisplayAttribute>() .LastOrDefault(); if (display != null) result = display.GetName(); return result ?? o.ToString(); }; var values = Enum.GetValues(ViewData.ModelMetadata.ModelType).Cast<object>() .Select(v => new SelectListItem { Selected = v.Equals(Model), Text = GetDisplayName(v), // v.ToString(), Value = v.ToString() }); } @Html.DropDownList("", values) 

рдпрд╣рд╛рдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛: рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд╣рд╛рдВ рднреА рд╕рдВрднрд╡ рд╣реЛ рдорд╣рд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк [UIHint("Enum")]рдЬреЛрдбрд╝ рднреА рдирд╣реАрдВ рд╕рдХрддреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ [Display(Name)]рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрдврд╝рддрд╛ рд╣реИ ред

C рдХрд╛ рдЕрд░реНрде рд╣реИ рдирд┐рдпрдВрддреНрд░рдХ


рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ UsersController.cs рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ ред

 public class UsersController : Controller { public int pageSize = 10; public int showPages = 15; public int count = 0; //    public ViewResult Index(string sortOrder, int page = 1) { string sortName = null; System.Web.Helpers.SortDirection sortDir = System.Web.Helpers.SortDirection.Ascending; sortOrder = Base.parseSortForDB(sortOrder, out sortName, out sortDir); UsersRepository rep = new UsersRepository(); UsersGrid users = new UsersGrid { Users = rep.List(sortName, sortDir, page, pageSize, out count), PagingInfo = new PagingInfo { currentPage = page, itemsPerPage = pageSize, totalItems = count, showPages = showPages }, SortingInfo = new SortingInfo { currentOrder = sortName, currentDirection = sortDir } }; return View(users); } [ReferrerHold] [HttpPost] public ActionResult Index(string onNewUser) { if (onNewUser != null) { TempData["referrer"] = ControllerContext.RouteData.Values["referrer"]; return View("New", new UserModel(new UserClass(), Languages())); } return View(); } [ReferrerHold] public ActionResult New() { TempData["referrer"] = ControllerContext.RouteData.Values["referrer"]; return View("New", new UserModel(new UserClass(), Languages())); } [HttpPost] public ActionResult New(UserModel model) { if (ModelState.IsValid) { if (model.User == null || model.User.Language == null || model.User.Language.LanguageID == 0) RedirectToAction("Index"); UsersRepository rep = new UsersRepository(); if (rep.AddUser(model.User)) TempData["message"] = string.Format("{0} has been added", model.User.Loginname); else TempData["error"] = string.Format("{0} has not been added!", model.User.Loginname); if (TempData["referrer"] != null) return Redirect(TempData["referrer"].ToString()); return RedirectToAction("Index"); } else { model = new UserModel(model.User, Languages()); // -          model.Languages,   return View(model); } } [ReferrerHold] public ActionResult Edit(int UserID) { UsersRepository rep = new UsersRepository(); UserClass user = rep.FetchByID(UserID); if (user == null) return HttpNotFound(); TempData["referrer"] = ControllerContext.RouteData.Values["referrer"]; return View(new UserModel(user, Languages())); } [HttpPost] public ActionResult Edit(UserModel model, string action) { if (action == "Cancel") { if (TempData["referrer"] != null) return Redirect(TempData["referrer"].ToString()); return RedirectToAction("Index"); } if (ModelState.IsValid) { if (model.User == null || model.User.Language == null || model.User.Language.LanguageID == 0) RedirectToAction("Index"); UsersRepository rep = new UsersRepository(); if (action == "Save") { if (rep.ChangeUser(model.User)) TempData["message"] = string.Format("{0} has been saved", model.User.Loginname); else TempData["error"] = string.Format("{0} has not been saved!", model.User.Loginname); } if (action == "Remove") { if (rep.RemoveUser(model.User)) TempData["message"] = string.Format("{0} has been removed", model.User.Loginname); else TempData["error"] = string.Format("{0} has not been removed!", model.User.Loginname); } if (TempData["referrer"] != null) return Redirect(TempData["referrer"].ToString()); return RedirectToAction("Index"); } else { model = new UserModel(model.User, Languages()); return View(model); } } public IList<LanguageClass> Languages() { IList<LanguageClass> languages = new List<LanguageClass>(); LanguagesRepository rep = new LanguagesRepository(); languages = rep.List(); return languages; } } 

рдЖрдЗрдП рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:

1) Index

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ : public ViewResult Index(string sortOrder, int page = 1)

рджреЛ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ sortOrderрдФрд░ pageред рд╕рд╛рде pageрд╕рднреА рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ sortOrderрдкрддрд╛ рдкрдЯреНрдЯреА рд╕реЗ, рдЖрдк рдПрдХ рдордирдорд╛рдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдЬреЛ рд╣рдо рддреЛ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рдореЗрдВ рд░рдЯрдирд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реАрдзреЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдЖрдк рдЗрд╕реЗ рдмреЗрд╕.рдХреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ): sortOrder = Base.parseSortForDB(sortOrder, out sortName, out sortDir);

рдлрд┐рд░ рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИ, рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ UsersRepository(рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ), ListрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╕реВрдЪреА рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБUsersGridрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реВрдЪреА рдФрд░ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдЫрдБрдЯрд╛рдИ рдХреЗ рдЖрдпреЛрдЬрди рдФрд░ рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, TotalItem рдХрд╛ рдорд╛рди рддрдм рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ List, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде UsersGridред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╡рд┐рдзрд┐ рднреА рд╣реИ рдЬрд┐рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ [HttpPost]рд▓рд┐рдП рд╣рдореЗрдВ рдмрдЯрди рдХреНрд▓рд┐рдХ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ : рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рджреГрд╢реНрдп рдореЗрдВ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЬрдм рд╣рдо рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рди рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо null рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ ред рдпрджрд┐ рдЯрд╛рдЗрдк рдмрдЯрди рджреГрд╢реНрдп рдореЗрдВ рд╣реЛрдЧрд╛NewIndexpublic ActionResult Index(string onNewUser)

onNewUser/>IndexsubmitIndexрдХрдИ, рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореВрд▓реНрдп "рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рд╣реЛрдЧрд╛)ред

рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ UserModel, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ UserClassрдФрд░ рднрд╛рд╖рд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рд╕реЗ рдЪреБрдирдХрд░ рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рднреЗрдЬрддреА рд╣реИ Newред рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА LanguageRepositoryрд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ ListрдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИ:

 public IList<LanguageClass> Languages() { LanguagesRepository rep = new LanguagesRepository(); return rep.List(); } 

2) рддрд░реАрдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ New

рд╡рд┐рдзрд┐ NewрдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдВрдХ рдкрд░ рдПрдХ рдХреНрд▓рд┐рдХ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдХреНрд░рд┐рдпрд╛ (рджреГрд╢реНрдп рдХреЛ рдЦреЛрд▓рдирд╛ ) рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рджрдмрд╛рдП рдЧрдП рдмрдЯрди рдкрд░ рдХреЛрдИ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдореЙрдбрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рднреЗрдЬрдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдХреНрд░рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдлрд╛рд░реНрдо рдбреЗрдЯрд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП: рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдиреНрдпреВ рд╕реНрдЯреЙрдХ рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ , рдЪреЗрдХ рдбреЗрдЯрд╛ рд╢реБрджреНрдзрддрд╛ (рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдореЗрдВ рдмрддрд╛рдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдФрд░ ) рднрдВрдбрд╛рд░ рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛, рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реИHtml.ActionLink("New user", "New", "Users")IndexNew

NewUserModelpublic ActionResult New(UserModel model)

UserModelUserClassLanguageClassUsersRepositoryAddUser(model.User)ред рдлрд┐рд░ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдкреГрд╖реНрда рдкрд░ рд▓реМрдЯрддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рд╕реЗ рджреГрд╢реНрдп рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ New) рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреА рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

3) Edit

рд╡рд┐рдзрд┐ EditрдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ UserID(рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА) рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрдкрд╛рджрд┐рдд рджреГрд╢реНрдп рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреА рд╣реИ: public ActionResult Edit(int UserID)

рд╡рд┐рдзрд┐ рдореЗрдВ, рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ UsersRepositoryрдФрд░ рдЗрд╕реЗ FetchByID(UserID)рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ UserClassред рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - UserModelрдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБ рдФрд░ рднрд╛рд╖рд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рдФрд░ EditрдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ ред

рдкреНрд░рдХрд╛рд░ UserModelрдФрд░ рдкрдВрдХреНрддрд┐ рдореЙрдбрд▓ рдХреЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ action:public ActionResult Edit(UserModel model, string action)

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ UserModelрдФрд░ рдпрд╣ рдХрд╛рд░реНрд░рд╡рд╛рдИ рддрдм рдХрд░рддрд╛ рд╣реИ рдЬрдм рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рджреГрд╢реНрдп рдХреЗ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдШрдЯрдирд╛рдПрдБ) Editред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ action, рдЬрд┐рд╕реЗ HTML рдкреНрд░рдХрд╛рд░ рдЯреИрдЧ рдХреЗ рдирд╛рдо рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ inputред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рдзрд┐ valueрдЗрди рдмрдЯрди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИ ред рд╡реИрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, CancelрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдкрд╛рджрди рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ ред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓реМрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ NewрдЙрдкрдпреЛрдЧ рджреГрд╢реНрдп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкреГрд╖реНрда рдХреЗ рдкрддреЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рджреГрд╢реНрдп рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛редEditред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдХ рдиреЗ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ ActionFilter: ReferrerHoldAttribute.csReferrerHoldAttribute рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдЧ ( HtmlAttribute рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ ):

 public class ReferrerHoldAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var referrer = filterContext.RequestContext.HttpContext.Request.UrlReferrer; if (referrer != null) filterContext.RouteData.Values.Add("referrer", referrer); base.OnActionExecuting(filterContext); } } 

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдкреГрд╖реНрда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ " рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ " рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкрд░ рд▓реМрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ : TempData["referrer"] = ControllerContext.RouteData.Values["referrer"];

рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рд░ рдмрд╛рд░ рд╣рдо рдПрдХ рд╣реА рдХреЛрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рди рд▓рд┐рдЦреЗрдВред рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХрдИ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ, рдЬреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИ NewрдФрд░ Editрд╕рдВрдЧреНрд░рд╣реАрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╕реЗ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: if (TempData["referrer"] != null) return Redirect(TempData["referrer"].ToString());

рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рддреБрд▓рдирд╛ рд╕реЗрд╡ рдФрд░ рдХреЗ actionрд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИрдирд┐рдХрд╛рд▓реЗрдВ, рдХреНрд░рдорд╢рдГ, рдФрд░ UsersRepositoryрдлрд╝рдВрдХреНрд╢рди ChangeUser(model.User)рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдмреБрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ RemoveUser(model.User)ред рдлрд┐рд░ рдкрд┐рдЫрд▓реЗ рдкреГрд╖реНрда (рдЬрд╣рд╛рдВ рд╕реЗ рджреГрд╢реНрдп рдХреЙрд▓ рдЖрдпрд╛ рдерд╛ Edit) рдкрд░ рд╡рд╛рдкрд╕реА рд╣реЛрддреА рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреА рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

ADO.NET рдФрд░ MySQL - рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА


рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рд╣рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ Users, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ, рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Languagesред

рдорд╛рдирдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ MySQL.Data рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ MySqlCommand:

 using (MySqlConnection connect = new MySqlConnection( )) { string sql = " "; using (MySqlCommand cmd = new MySqlCommand(sql, connect)) { cmd.Parameters.Add(" ",  ).Value =  ; connect.Open(); result = cmd.ExecuteNonQuery() >= 0; //        (INSERT, UPDATE, DELETE)   cmd.ExecuteScalar()         SELECT } } 

рдпрд╛ MySqlDataReaderрдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП:
 using (MySqlConnection connect = new MySqlConnection( )) { string sql = " "; using (MySqlDataReader dr = cmd.ExecuteReader()) { cmd.Parameters.Add(" ",  ).Value =  ; objConnect.Open(); while (dr.Read()) {//       } } } 

рдореЙрдбрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ UserRepository.cs рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ :

 public class UsersRepository { public bool AddUser(UserClass user) { user.UserID = AddUser(Name: user.Loginname, LanguageID: user.Language.LanguageID, Email: user.Email, SupporterTier: user.SupporterTier); return user.UserID > 0; } public int AddUser(string Name, int LanguageID, string Email, Supporter SupporterTier) { int ID = 0; using (MySqlConnection connect = new MySqlConnection(Base.strConnect)) { string sql = "INSERT INTO `Users` (`Loginname`, `LanguageID`, `Email`, `SupporterTier`) VALUES (@Loginname, @LanguageID, @Email, @SupporterTier)"; using (MySqlCommand cmd = new MySqlCommand(sql, connect)) { cmd.Parameters.Add("Loginname", MySqlDbType.String).Value = Name; cmd.Parameters.Add("LanguageID", MySqlDbType.Int32).Value = LanguageID; cmd.Parameters.Add("Email", MySqlDbType.String).Value = Email; cmd.Parameters.Add("SupporterTier", MySqlDbType.Int32).Value = SupporterTier; connect.Open(); if (cmd.ExecuteNonQuery() >= 0) { sql = "SELECT LAST_INSERT_ID() AS ID"; cmd.CommandText = sql; int.TryParse(cmd.ExecuteScalar().ToString(), out ID); } } } return ID; } public bool ChangeUser(UserClass user) { return ChangeUser(ID: user.UserID, Name: user.Loginname, LanguageID: user.Language.LanguageID, Email: user.Email, SupporterTier: user.SupporterTier); } public bool ChangeUser(int ID, string Name, int LanguageID, string Email, Supporter SupporterTier) { bool result = false; if (ID > 0) { using (MySqlConnection connect = new MySqlConnection(Base.strConnect)) { string sql = "UPDATE `Users` SET `Loginname`=@Loginname, `LanguageID`=@LanguageID, `Email`=@Email, `SupporterTier`=@SupporterTier WHERE UserID=@UserID"; using (MySqlCommand cmd = new MySqlCommand(sql, connect)) { cmd.Parameters.Add("UserID", MySqlDbType.Int32).Value = ID; cmd.Parameters.Add("Loginname", MySqlDbType.String).Value = Name; cmd.Parameters.Add("LanguageID", MySqlDbType.Int32).Value = LanguageID; cmd.Parameters.Add("Email", MySqlDbType.String).Value = Email; cmd.Parameters.Add("SupporterTier", MySqlDbType.Int32).Value = SupporterTier; connect.Open(); result = cmd.ExecuteNonQuery() >= 0; } } } return result; } public bool RemoveUser(UserClass user) { return RemoveUser(user.UserID); } public bool RemoveUser(int ID) { using (MySqlConnection connect = new MySqlConnection(Base.strConnect)) { string sql = "DELETE FROM `Users` WHERE `UserID`=@UserID"; using (MySqlCommand cmd = new MySqlCommand(sql, connect)) { cmd.Parameters.Add("UserID", MySqlDbType.Int32).Value = ID; connect.Open(); return cmd.ExecuteNonQuery() >= 0; } } } public UserClass FetchByID(int ID) { UserClass user = null; using (MySqlConnection objConnect = new MySqlConnection(Base.strConnect)) { string strSQL = "SELECT u.`UserID`, u.`Loginname`, l.`LanguageID`, l.`LanguageName`, u.`Email`, u.`LastLoginDate`, CAST(u.`SupporterTier` AS UNSIGNED) as `SupporterTier` FROM `Users` u LEFT JOIN `Languages` l ON l.LanguageID=u.LanguageID WHERE `UserID`=@UserID"; using (MySqlCommand cmd = new MySqlCommand(strSQL, objConnect)) { objConnect.Open(); int UserID = 0, LanguageID = 0; string Loginname = null, LanguageName= null, Email = String.Empty; Supporter SupporterTier = Supporter.None; DateTime? LastLoginDate = null; cmd.Parameters.Add("UserID", MySqlDbType.Int32).Value = ID; using (MySqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read()) { UserID = dr.GetInt32("UserID"); Loginname = dr.GetString("Loginname").ToString(); LanguageID = dr.GetInt32("LanguageID"); LanguageName = dr.GetString("LanguageName").ToString(); if (!dr.IsDBNull(dr.GetOrdinal("Email"))) Email = dr.GetString("Email").ToString(); if (!dr.IsDBNull(dr.GetOrdinal("LastLoginDate"))) LastLoginDate = dr.GetDateTime("LastLoginDate"); if (!dr.IsDBNull(dr.GetOrdinal("SupporterTier"))) SupporterTier = (Supporter)dr.GetInt32("SupporterTier"); } LanguageClass language = null; if (LanguageID > 0) language = new LanguageClass(LanguageID: LanguageID, LanguageName: LanguageName); if (UserID > 0 && language != null && language.LanguageID > 0) user = new UserClass(UserID: UserID, Loginname: Loginname, Language: language, Email: Email, LastLoginDate: LastLoginDate, SupporterTier: (Supporter)SupporterTier); } } } return user; } //       ASP.NET WebForms,             ObjectDataSource      //     ,         " "         //public IEnumerable<DataRow> List() //{ // using (MySqlConnection objConnect = new MySqlConnection(Base.strConnect)) // { // string strSQL = "select * from users"; // using (MySqlCommand objCommand = new MySqlCommand(strSQL, objConnect)) // { // objConnect.Open(); // using (MySqlDataAdapter da = new MySqlDataAdapter(objCommand)) // { // DataTable dt = new DataTable(); // da.Fill(dt); // return dt.AsEnumerable(); // } // } // } //} public IList<UserClass> List(string sortOrder, System.Web.Helpers.SortDirection sortDir, int page, int pagesize, out int count) { List<UserClass> users = new List<UserClass>(); using (MySqlConnection objConnect = new MySqlConnection(Base.strConnect)) { //     string sort = " ORDER BY "; //   ,               (inject) // ,  , MySQL        //    ,         (       ) //        ,    if (sortOrder != null && sortOrder != String.Empty) { sort += "`" + sortOrder + "`"; if (sortDir == System.Web.Helpers.SortDirection.Descending) sort += " DESC"; sort += ","; } sort += "`UserID`"; //   //        ( ) string limit = ""; if (pagesize > 0) { int start = (page - 1) * pagesize; limit = string.Concat(" LIMIT ", start.ToString(), ", ", pagesize.ToString()); } string strSQL = "SELECT SQL_CALC_FOUND_ROWS u.`UserID`, u.`Loginname`, l.`LanguageID`, l.`LanguageName` as `Language`, u.`Email`, u.`LastLoginDate`, CAST(u.`SupporterTier` AS UNSIGNED) as `SupporterTier` FROM `Users` u LEFT JOIN `Languages` l ON l.LanguageID=u.LanguageID" + sort + limit; using (MySqlCommand cmd = new MySqlCommand(strSQL, objConnect)) { objConnect.Open(); cmd.Parameters.Add("page", MySqlDbType.Int32).Value = page; cmd.Parameters.Add("pagesize", MySqlDbType.Int32).Value = pagesize; using (MySqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { LanguageClass language = new LanguageClass(LanguageID: dr.GetInt32("LanguageID"), LanguageName: dr.GetString("Language").ToString()); users.Add(new UserClass( UserID: dr.GetInt32("UserID"), Loginname: dr.GetString("Loginname"), Language: language, Email: dr.IsDBNull(dr.GetOrdinal("Email")) ? String.Empty : dr.GetString("Email"), LastLoginDate: dr.IsDBNull(dr.GetOrdinal("LastLoginDate")) ? (DateTime?) null : dr.GetDateTime("LastLoginDate"), SupporterTier: dr.IsDBNull(dr.GetOrdinal("SupporterTier")) ? (Supporter) Supporter.None : (Supporter)dr.GetInt32("SupporterTier"))); } } } using (MySqlCommand cmdrows = new MySqlCommand("SELECT FOUND_ROWS()", objConnect)) { int.TryParse(cmdrows.ExecuteScalar().ToString(), out count); } } return users; } } 

рдЗрд╕рдореЗрдВ AddUserрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ , рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ ( ChangeUser), рд╣рдЯрд╛рдирд╛ ( RemoveUser), рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЦреЛрдЬ ( FetchByID) рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдФрд░ ListрдЫрдБрдЯрд╛рдИ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реИ ред рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ List:

  1. рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ ( DataTable) рдЗрд╕ рддрд░рд╣ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреГрд╢реНрдп рдореЗрдВ рд╡рд░реНрдЧ рдХреЗ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рджреЗрдВрдЧреЗ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдВрдЧреЗред рдпрд╛рдиреА SQL-. UserClass .
  2. LIMIT SQL- SELECT . , MySQL , LIMIT . , , ORDER BY . , SQL-, SQL , , . , , : .
  3. SQL SELECT FOUND_ROWS() , , SELECT SQL_CALC_FOUND_ROWS LIMIT .

рдЕрдиреНрдп рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдКрдкрд░ рдХреЗ рдХреИрдирди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред

рдФрд░ LanguageRepository.cs рдореЙрдбрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ :

 public class LanguagesRepository { public IList<LanguageClass> List() { List<LanguageClass> languages = new List<LanguageClass>(); using (MySqlConnection objConnect = new MySqlConnection(Base.strConnect)) { string strSQL = "SELECT `LanguageID`, `LanguageName` as `Language` FROM `Languages` ORDER BY `LanguageName`"; using (MySqlCommand cmd = new MySqlCommand(strSQL, objConnect)) { objConnect.Open(); using (MySqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { LanguageClass language = new LanguageClass(LanguageID: dr.GetInt32("LanguageID"), LanguageName: dr.GetString("Language").ToString()); languages.Add(language); } } } } return languages; } } 

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд╣реИ, рд╡рд░реНрдЧ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ LanguageClassред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░


рд╡рд╣ рд╕рдм - рдХрд╛рд░реНрдп рд╣рд▓ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрдИ рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдВрдЯреЗрдирд░, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг, рдореЛрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг, рд╕реНрдерд╛рдиреАрдпрдХрд░рдг, рдЖрджрд┐ред рдЖрджрд┐рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЕрд▓рдЧ рдпрд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬреЛ "рдИрдВрдЯ" рдирд┐рдХрд▓рд╛, рд╡рд╣ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ рдХрд┐ ASP.NET MVC рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ ADO.NET рдФрд░ DBMS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ MS SQL рдирд╣реАрдВ рд╣реИрдВред

PS рдФрд░ рдЕрдВрдд рдореЗрдВ: рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕ рдкрддреЗ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рдФрд░ рдпрд╣рд╛рдВ рдЖрдк рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рдвреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдбрд╝реА ред

Source: https://habr.com/ru/post/hi482346/


All Articles