рдмреНрд▓реЗрдЬрд╝рд░ + рдПрдорд╡реАрд╡реАрдПрдо = рдЪрд╛рдВрджреА рдХреА рд░реЛрд╢рдиреА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╛рдЪреАрди рдмреБрд░рд╛рдИ рдЕрдЬреЗрдп рд╣реИ

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рддреЛ рд╣рд╛рдБ, рдиреЗрдЯ рдХреЛрд░ 3.0 рдЬрд▓реНрдж рд╣реА рдЖ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмреНрд▓реЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реЛрдЧрд╛ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдирд╛рдо, рдХреБрдЫ Pokemon рдХреЗ рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИред рдмреНрд▓реЗрдЬрд╝рд░ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ! рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЬрд╛рдирд╡рд░ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдПрдХ рдЯреЛрдбреЛ рд╢реАрдЯ рдмрдирд╛рдИред рдЦреИрд░, Vue.js рдкрд░ рднреА, рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╡реЗ рджреЛрдиреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХрддрд╛ рдореЗрдВ рдШрдЯрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдмред рдЕрдзрд┐рдХ рджреЗрд╡реА рджреЗрд╡рддрд╛! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдпреБрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб рд╣реИ, рди рдХрд┐ рдордЬрдмреВрдд рджрд┐рдорд╛рдЧ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ рдФрд░ рд╕рд╛рдЗрдЯ рдкрд░ рдмрдЯрди рдФрд░ рдЗрдирдкреБрдЯ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрд╕ рдореЗрдо рдХреА рддрд░рд╣ - "рддрдХрдиреАрдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдПрдХ рдХрд┐рддрд╛рдм рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рд▓реЗрдХрд┐рди рдирд┐рд░реНрджреЗрд╢ рдирд┐рдХрд▓рд╛ред" рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рдореЗрдВ рдореЗрд░реЗ рдХрд╛рд░рдирд╛рдореЛрдВ рдореЗрдВ рдХреМрди рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реИ рдпрд╛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдмреНрд▓реЗрдЬрд╝рд░ рд╣реИред

рдкрд░рд┐рдЪрдп


Microsoft рдиреЗ рдПрдХ рдмрд╛рд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ C # рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд░рдЦрд╛ рдФрд░ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ Silverlight рдХрд╣рд╛ред рдпрд╣ рдмрдВрдж рдирд╣реАрдВ рд╣реБрдЖред рдпреЗ рдЖрдкрдХреЗ рдЯрд╛рдпрд░рдиреЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднрд┐рдиреНрди рдереЗред рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рджреВрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╡реЗрдм рдЕрд╕реЗрдВрдмрд▓реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рд╣реИрдВред рдЕрд▓рдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рдЖрд╡реЗрджрди рдЖрдХрд╛рд░ рд╣реИред рдпрджрд┐ Vue.js SPA рдХрд╛ рд╡рдЬрди 1.7 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╣реИ, рддреЛ рдмреНрд▓реЗрдЬрд╝рд░ 21 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИред рдЕрдм рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХреЗ рджреМрд░рд╛рди рдЗрдВрдЯрд░рдиреЗрдЯ рддреЗрдЬреА рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдХреИрд╢ рдФрд░ рд╕рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, Blazor Vue.js. рдХреЗ рд╕рдорд╛рди рдерд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рд┐рд▓реНрд╡рд░рд▓рд┐рдЧреНрдЯ, WPF рдФрд░ UWP рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╢рд╛рд░реНрдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдЗрддрдирд╛ рдЖрдо рдерд╛, рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП MVVM рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП - рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдмреИрдХ-рдПрдВрдб рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдмреНрд▓реЗрдЬрд░ рдкрд╕рдВрдж рд╣реИред рдореИрдВ рджрд┐рд▓ рдХреЗ рдмреЗрд╣реЛрд╢ рд╣реЛрдиреЗ рдХреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ - рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рд▓реЗрдЖрдЙрдЯ рднрдпрд╛рдирдХ рд╣реИрдВ, рдФрд░ Vue.js рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрднрд╡реА рдлреНрд░рдВрдЯ-рдПрдВрдб рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреЛрд╡рд╛рдиреЛрдХреЙрдб рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рд╡рд░реНрддрдиреА рдФрд░ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде, рдЪреАрдЬреЗрдВ рднреА рдЗрддрдиреА рд╣реИрдВред

рд╕рдВрджрд░реНрдн


рд╡реВрдб + рд╡реБрдХреНрд╕ рдкрд░ рдЯреЛрдбреЛ рдЙрджрд╛рд╣рд░рдг
рдмреНрд▓рд╛рдЬрд╝реЛрд░ рдкрд░ рдЯреЛрдбреЛ рдЙрджрд╛рд╣рд░рдг

рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдореЙрдбрд▓


  1. рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдлред рдПрдХ рдорд╛рдирдХ рдПрд╕рдкреАрдП рдЬрд┐рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ asp.net рдХреЛрд░ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдЙрди 21 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдВ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  2. рд╕рд░реНрд╡рд░ рдХреА рддрд░рдлред рд╕рдм рдХреБрдЫ рд╕рд░реНрд╡рд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдорд╛рдкреНрдд рдбреЛрдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреБрдЫ рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП DOM рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдЦреИрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдкрд░ рдкреВрд░рд╛ рд▓реЛрдб рдЕрдЪрд╛рдирдХ рд╕рд░реНрд╡рд░ рдкрд░ рдкрдбрд╝рддрд╛ рд╣реИред

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

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг


рдиреЗрдЯ рдХреЛрд░ 3.0 dotnet.microsoft.com/download/dotnet-core/3.0 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред

dotnet new -i Microsoft.AspNetCore.Blazor.Templates 

рдПрдХ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП

 dotnet new blazorserverside -o MyWebApp 

рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреА рдлрд╛рдЗрд▓реЗрдВ asp.net рдХреЛрд░ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рддрд░рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреА

 dotnet new blazorhosted -o MyWebApp 

рдпрджрд┐ рдЖрдк рд╡рд┐рджреЗрд╢реАрд╡рд╛рдж рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рдЕрдЪрд╛рдирдХ рдПрд╕реНрдкреНрд░реЗрд╕ рдХреЛрд░ рдХреЛ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ (рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?) рдЖрдк рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 dotnet new blazor -o MyWebApp 

рдмрд╛рдЗрдВрдбрд┐рдВрдЧ


рдПрдХ-рддрд░рдлрд╝рд╛ рдФрд░ рджреЛ-рддрд░рдлрд╝рд╛ рдмрдВрдзрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рддреЛ рд╣рд╛рдБ, рдЖрдкрдХреЛ WPF рдХреА рддрд░рд╣ рдХрд┐рд╕реА рднреА OnPropertichanged рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджреГрд╢реНрдп рдореЙрдбрд▓ рдмрджрд▓рддреЗ рд╕рдордп, рд▓реЗрдЖрдЙрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

 <label>One way binding:</label> <br /> <input type="text" value=@Text /> <br /> <label>Two way binding:</label> <br /> <input type="text" @bind=@Text /> <br /> <label>Two way binding         Text   oninput:</label> <br /> <input type="text" @bind=@Text @bind:event="oninput" /> //ViewModel @code{ string Text; async Task InpuValueChanged() { Console.WriteLine("Input value changed"); } } 

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ ViewModel (рдЕрдирд╛рдо) рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рд╣реИред

рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдореЗрдВ, "value = @ Text" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдордиреЗ рдПрдХ рддрд░рдлрд╝рд╛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдмрдирд╛рдпрд╛ред рдЕрдм рдЬрдм рд╣рдо рдХреЛрдб рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЗрдирдкреБрдЯ рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдЯреЗрдХреНрд╕реНрдЯ рддреБрд░рдВрдд рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдЗрдирдкреБрдЯ рдореЗрдВ, "@ рдмрд╛рдЗрдВрдб = @ рдЯреЗрдХреНрд╕реНрдЯ" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдордиреЗ рджреЛ-рддрд░рдлрд╝рд╛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдмрдирд╛рдпрд╛ред рдЕрдм рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ VM рддреБрд░рдВрдд рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рднреА рд╕рд╣реА рд╣реИ рдЕрд░реНрдерд╛рддреНред рдпрджрд┐ рд╣рдо рдХреЛрдб рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рдЗрдирдкреБрдЯ рддреБрд░рдВрдд рдирдП рдореВрд▓реНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдПрдХ BUT рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкрд░рд┐рд╡рд░реНрддрди рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдХреЗ рдСрдирдХреЙрдиреНрдЧ рдЗрд╡реЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдЗрдирдкреБрдЯ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗ рддрднреА VM рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рддреАрд╕рд░реЗ рдЗрдирдкреБрдЯ "@bind: event =" oninput "" рдореЗрдВ рд╣рдордиреЗ рд╡реАрдПрдо рдбреЗрдЯрд╛ рдХреЛ рдСрдирд┐рдирдкреБрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдЕрдм рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдХреБрдЫ рд╡рд░реНрдг рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреЛ рддреБрд░рдВрдд рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 <input @bind=@Today @bind:format="yyyy-MM-dd" /> 

рдореЙрдбрд▓ рджреЗрдЦреЗрдВ


рдЖрдк рдЗрд╕реЗ рдЕрдирд╛рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕реЗ "@code {}" рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛

 @page "/todo" <p>  @UserName </p> @code{ public string UserName{get; set;} } 

рдпрд╛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рддрдм рдЗрд╕реЗ ComponentBase рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреГрд╖реНрда рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ "@inits" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ VM рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

TodoViewModel.cs:

 public class TodoViewModel: ComponentBase{ public string UserName{get; set;} } 

Todo.razor:

 @page "/todo" @inherits MyWebApp.ViewModels.TodoViewModel <p>  @UserName </p> 

рдорд╛рд░реНрдЧ


рдЙрди рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреГрд╖реНрда рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ, рдкреГрд╖реНрда рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ "@ рдкреГрд╖реНрда" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реБрдП рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 @page "/todo" @page "/todo/delete" <h1> Hello!</h1> 

рдпрд╣ рдкреГрд╖реНрда "/ todo" рдпрд╛ "todo / delete" рдкрд░ рдЦреБрд▓реЗрдЧрд╛

Layauty


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдИ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЪреАрдЬреЗрдВ рдЖрдорддреМрд░ рдкрд░ рдпрд╣рд╛рдВ рд░рдЦреА рдЬрд╛рддреА рд╣реИрдВред рдПрдХ рд╕рд╛рдЗрдбрдмрд╛рд░ рдХреА рддрд░рд╣, рдФрд░ рдЕрдзрд┐рдХред

рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ "@inherits" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ LayotComponentBase рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 @inherits LayoutComponentBase <div class="sidebar"> <NavMenu /> </div> <div class="main"> <div class="top-row px-4"> <a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a> </div> <div class="content px-4"> @Body </div> </div> 

рджреВрд╕рд░реЗ, рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдЖрдкрдХреЛ _imports.razor рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "@layout" рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ

 @layout MainLayout @using System 

рддреАрд╕рд░рд╛, рдЖрдк рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рд▓реЗрдЖрдЙрдЯ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

 @layout MainLayout @page "/todo" @inherits BlazorApp.Client.Presentation.TodoViewModel <h3>Todo</h3> 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, _imports.razor рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрдВред

рдорд╛рд░реНрдЧ рд╡рд┐рдХрд▓реНрдк


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдорд╛рд░реНрдЧ (рдХреЗрд╕ рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓) рдореЗрдВ рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рддреЛ рд╣рд╛рдВ, рдХреЛрдИ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдорд╛рди рд╣рдореЗрд╢рд╛ рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдорд╛рди рд╣рдорд╛рд░реЗ ViewModel рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ [Parameter] BTB рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдкрд╣рд▓реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ - рдореВрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдФрд░ рдИрд╡реЗрдВрдЯреНрд╕ рднреА Par Parameter [Parameter] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХреИрд╕реНрдХреЗрдбрд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡реЗ рдореВрд▓ рдШрдЯрдХ рд╕реЗ рдЙрд╕рдХреЗ рд╕рднреА рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл CSS рдореЗрдВ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред

 @page "/todo/delete/{id:guid}" <h1> Hello!</h1> @code{ [Parameter] public Guid Id { get; set; } } 

рдбрд┐


рд╕рдм рдХреБрдЫ Startup.cs рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд asp.net рдХреЛрд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рди рдХрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХреЗрд╡рд▓ [Inject] рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

  public class DeleteTodoViewModel : ComponentBase { [Parameter] private Guid Id { get; set; } [Inject] public ICommandDispatcher CommandDispatcher { get; set; } 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, 3 рд╕реЗрд╡рд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВред HttpClient - рдареАрдХ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпреЛрдВред IJSRuntime - C # рд╕реЗ JS рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред IUriHelper - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдЖрд╡реЗрджрди рдЙрджрд╛рд╣рд░рдг


рдЯреЛрдбреЛ рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯ


TodoTableComponent.razor:

 //1) <table class="table table-hover"> <thead> <th> </th> <th></th> <th> </th> <th></th> </thead> <tbody> //2) @foreach (var item in Items) { //3) <tr @onclick=@(()=>ClickRow(item.Id)) class="@(item.Id == Current?"table-primary":null)"> <td><input type="checkbox" checked="@item.IsComplite" disabled="disabled" /></td> <td>@item.Name</td> <td>@item.Created.ToString("dd.MM.yyyy HH:mm:ss")</td> <td><a href="/todo/delete/@item.Id" class="btn btn-danger"></a></td> </tr> } </tbody> </table> @code { //4) [Parameter] private List<BlazorApp.Client.Presentation.TodoDto> Items { get; set; } [Parameter] private EventCallback<UIMouseEventArgs> OnClick { get; set; } [Parameter] private Guid Current { get; set; } private async Task ClickRow(Guid id) { //5 await OnClick.InvokeAsync(CreateArgs(id)); } private ClickTodoEventArgs CreateArgs(Guid id) { return new ClickTodoEventArgs { Id = id }; } //6) public class ClickTodoEventArgs : UIMouseEventArgs { public Guid Id { get; set; } } } 

  1. рдЗрд╕ рдШрдЯрдХ рдХреЗ рдмрд╛рдж рд╕реЗ рд╣рдореЗрдВ "@ рдкреГрд╖реНрда" рдФрд░ "@layout" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░реВрдЯрд┐рдВрдЧ рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗрдЧрд╛ рдФрд░ рдпрд╣ рдореВрд▓ рдШрдЯрдХ рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛
  2. C # рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд @ рд╕рд┐рдВрдмрд▓ рд╕реЗ рд╣реЛрддреА рд╣реИред рдЕрд╕рд▓ рдореЗрдВ рд░реЗрдЬрд░ рдореЗрдВ рднреА рдРрд╕рд╛ рд╣реА рд╣реИ
  3.  @onclick=@(()=>ClickRow(item.Id)) 
    рд╣рдорд╛рд░реЗ ViewModel рдХреЗ ClickRow рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдХреНрд▓рд┐рдХ рдШрдЯрдирд╛ рдХреЛ рдмрд╛рдВрдзрддрд╛ рд╣реИ
  4. рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рди рдкреИрд░рд╛рдореАрдЯрд░реЛрдВ рдХреЛ рдореВрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдкреГрд╖реНрда рд╕реЗ рд╣рдорд╛рд░реЗ [рдкреИрд░рд╛рдореАрдЯрд░] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
  5. рд╣рдо рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореВрд▓ рдШрдЯрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛ред рддреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдШрдЯрдХ рдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЗ рдореЗрдВ рдХреБрдЫ рдШрдЯрдирд╛ рдШрдЯреА рд╣реИред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЗрд╡рд▓ EventCallback <> рдкреИрд░рд╛рдореАрдЯрд░рд╛рдЗрдЬрд╝реНрдб EventArgs рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред EventArgs рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реВрдЪреА рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ - docs.microsoft.com/ru-ru/aspnet/core/blazor/compenders?view=aspnetcore-3.0#event-handling
  6. рдЪреВрдВрдХрд┐ EventArgs рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рд╣рдореЗрдВ рдореВрд▓ рдШрдЯрдХ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд Id рдЧреБрдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрдЧ рдХреЛ рдЖрдзрд╛рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдШрдЯрдирд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рд╣рд╛рдБ - рдореВрд▓ рдШрдЯрдХ рдореЗрдВ, рдирд┐рдпрдорд┐рдд UIMouseEventArgs рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 <TodoTableComponent Items=@Items OnClick=@Select Current=@(Selected?.Id??Guid.Empty)></TodoTableComponent> 

рдЯреЛрдбреЛ рд╣рдЯрд╛рдирд╛ рдкреГрд╖реНрда


рд╣рдорд╛рд░рд╛ ViewModel рдЙрд░реНрдл тАЛтАЛVM DeleteTodoViewModel.cs рд╣реИ:

 public class DeleteTodoViewModel : ComponentBase { //1) [Parameter] private Guid Id { get; set; } //2) [Inject] public ICommandDispatcher CommandDispatcher { get; set; } [Inject] public IQueryDispatcher QueryDispatcher { get; set; } [Inject] public IUriHelper UriHelper { get; set; } //3) public TodoDto Todo { get; set; } protected override async Task OnInitAsync() { var todo = await QueryDispatcher.Execute<GetById,TodoItem>(new GetById(Id)); if (todo != null) Todo = new TodoDto { Id = todo.Id, IsComplite = todo.IsComplite, Name = todo.Name, Created = todo.Created }; await base.OnInitAsync(); } //4) public async Task Delete() { if (Todo != null) await CommandDispatcher.Execute(new Remove(Todo.Id)); Todo = null; //5) UriHelper.NavigateTo("/todo"); } } 

  1. рдорд╛рд░реНрдЧ рдкреИрд░рд╛рдореАрдЯрд░ "/ рдЯреВрдбреВ / рдбрд┐рд▓реАрдЯ / {рдЖрдИрдбреА: рдЧрд╛рдЗрдб}" рдпрд╣рд╛рдВ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ / рдЯреВрдбреВ / рдбрд┐рд▓реАрдЯ / ae434aae44 ...
  2. рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдореЗрдВ рдбреАрдЖрдИ рдХрдВрдЯреЗрдирд░ рд╕реЗ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред
  3. рдмрд╕ рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ред рд╣рдо рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  4. рдкреЗрдЬ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдкрдиреЗ рдЖрдк рдХрд╣рд▓рд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рд╡реАрдПрдо рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  5. рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреА рд╡рд┐рдзрд┐ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЗ рдХрд┐рд╕реА рднреА рдмрдЯрди рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВ
  6. "/ Todo" рдХреЗ рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд╛рдЗрди "@page" / todo "" рд╣реИ
    рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп DeleteTodo.razor рд╣реИ:

     //1) @page "/todo/delete/{id:guid}" @using BlazorApp.Client.TodoModule.Presentation @using BlazorApp.Client.Shared; //2) @layout MainLayout //3) @inherits DeleteTodoViewModel <h3> Todo </h3> @if (Todo != null) { <div class="row"> <div class="col"> <input type="checkbox" checked=@Todo.IsComplite disabled="disabled" /> <br /> <label>@Todo.Name</label> <br /> //4) <button class="btn btn-danger" onclick=@Delete></button> </div> </div> } else { <p><em> Todo  </em></p> } 

    1. рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рджреЗрд╢ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдХреЗ рдкрддреЗ {рд░реВрдЯ рдПрдбреНрд░реЗрд╕} + "/ рдЯреВрдбреВ / рдбрд┐рд▓реАрдЯ /" + {рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЧрд╛рдЗрдб} рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ / рдЯреВрдбреВ / рдбрд┐рд▓реАрдЯ / ae434aae44 ...
    2. рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкреЗрдЬ MainLayout.razor рдХреЗ рдЕрдВрджрд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
    3. рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкреГрд╖реНрда DeleteTodoViewModel рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛
    4. рд╣рдо рд╕рдВрдХреАрд░реНрдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ VM рдХрд╛ рдбрд┐рд▓реАрдЯ () рддрд░реАрдХрд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛

    рдЯреЛрдбреЛ рд╣реЛрдо


    TodoViewModel.cs:

      public class TodoViewModel : ComponentBase { [Inject] public ICommandDispatcher CommandDispatcher { get; set; } [Inject] public IQueryDispatcher QueryDispatcher { get; set; } //1) [Required(ErrorMessage = "  Todo")] public string NewTodo { get; set; } public List<TodoDto> Items { get; set; } public TodoDto Selected { get; set; } protected override async Task OnInitAsync() { await LoadTodos(); await base.OnInitAsync(); } public async Task Create() { await CommandDispatcher.Execute(new Add(NewTodo)); await LoadTodos(); NewTodo = string.Empty; } //2) public async Task Select(UIMouseEventArgs args) { //3) var e = args as TodoTableComponent.ClickTodoEventArgs; if (e == null) return; var todo = await QueryDispatcher.Execute<GetById, TodoItem>(new GetById(e.Id)); if (todo == null) { Selected = null; return; } Selected = new TodoDto { Id = todo.Id, IsComplite = todo.IsComplite, Name = todo.Name, Created = todo.Created }; } public void CanselEdit() { Selected = null; } public async Task Update() { await CommandDispatcher.Execute(new Update(Selected.Id, Selected.Name, Selected.IsComplite)); Selected = null; await LoadTodos(); } private async Task LoadTodos() { var todos = await QueryDispatcher.Execute<GetAll, List<TodoItem>>(new GetAll()); Items = todos.Select(t => new TodoDto { Id = t.Id, IsComplite = t.IsComplite, Name = t.Name, Created = t.Created }) .ToList(); } } 

    1. System.ComponentModel.DataAnnotations рд╕реЗ рдорд╛рдирдХ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдкрд╛рда рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдЧрд╛ред
    2. рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ред рдпрд╣ рд╡рд┐рдзрд┐ рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХ рд╕реЗ рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧреАред
    3. рд╣рдо рдЙрд╕ рддрд░реНрдХ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдЪрд╛рдЗрд▓реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛

    Todo.razor:

     @layout MainLayout @page "/todo" @inherits BlazorApp.Client.Presentation.TodoViewModel <h3>Todo</h3> <h4></h4> <div class="row"> <div class="col"> @if (Items == null) { <p><em>...</em></p> } else if (Items.Count == 0) { <p><em>   .    .</em></p> } else { //1) <TodoTableComponent Items=@Items OnClick=@Select Current=@(Selected?.Id??Guid.Empty)></TodoTableComponent> } </div> </div> <br /> <h4> Todo</h4> <div class="row"> <div class="col"> @if (Items != null) { //2) <EditForm name="addForm" Model=@this OnValidSubmit=@Create> //3) <DataAnnotationsValidator /> //4) <ValidationSummary /> <div class="form-group"> //5) <InputText @bind-Value=@NewTodo /> //6) <ValidationMessage For="@(() => this. NewTodo)" /> //7) <button type="submit" class="btn btn-primary"></button> </div> </EditForm> } </div> </div> <br /> <h4> Todo</h4> <div class="row"> <div class="col"> @if (Items != null) { @if (Selected != null) { <EditForm name="editForm" Model=@Selected OnValidSubmit=@Update> <DataAnnotationsValidator /> <ValidationSummary /> <div class="form-group"> <InputCheckbox @bind-Value=@Selected.IsComplite /> <InputText @bind-Value=@Selected.Name /> <button type="submit" class="btn btn-primary"></button> <button type="reset" class="btn btn-warning" @onclick=@CanselEdit></button> </div> </EditForm> } else { <p><em>     </em></p> } } </div> </div> 

    1. рд╣рдо рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреЗ рдЧреБрдгреЛрдВ рдФрд░ рддрд░реАрдХреЛрдВ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
    2. рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдШрдЯрдХред рд╣рдо рдЗрд╕рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╣ рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡реИрдз рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╕рдордп рд╡рд╣ рдЗрд╕рдХреА рдХреНрд░рд┐рдПрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛
    3. [рдЖрд╡рд╢реНрдпрдХ] рдЖрджрд┐ рдЬреИрд╕реЗ рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
    4. рдпрд╣рд╛рдВ рдореИрдВ рд╕рддреНрдпрд╛рдкрди рдХреА рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдВрдЧрд╛
    5. рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдмрдирд╛рдПрдВрдЧреЗред рд╕рдВрднрд╛рд╡рд┐рдд рдЯреИрдЧреНрд╕ рдХреА рд╕реВрдЪреА InputText, InputTextArea, InputSelect, InputNumber, InputCheckbox, InputTate
    6. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░реЙрдкрд░реНрдЯреА NewTodo {get; рд╕реЗрдЯ;} рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╣рд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреА
    7. рдЬрдм рдЖрдк рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдо рдХреА OnValidSubmit рдШрдЯрдирд╛ рдХреЛ рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛

    Startup.cs рдлрд╝рд╛рдЗрд▓


    рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ

     public class Startup { public void ConfigureServices(IServiceCollection services) { // LocalStorage  SessionStorage       //    //     Nuget  Blazor.Extensions.Storage services.AddStorage(); services.AddSingleton<ITodoRepository, TodoRepository>(); services.AddSingleton<ICommandDispatcher, CommandDispatcher>(); services.AddSingleton<IQueryDispatcher, QueryDispatcher>(); services.AddSingleton<IQueryHandler<GetAll, List<TodoItem>>, GetAllHandler>(); services.AddSingleton<IQueryHandler<GetById, TodoItem>, GetByIdHandler>(); services.AddSingleton<ICommandHandler<Add>, AddHandler>(); services.AddSingleton<ICommandHandler<Remove>, RemoveHandler>(); services.AddSingleton<ICommandHandler<Update>, UpdateHandler>(); } public void Configure(IComponentsApplicationBuilder app) { //       App.razor //        <app></app> app.AddComponent<App>("app"); } } 

    рдЙрдкрд╕рдВрд╣рд╛рд░


    рдпрд╣ рд▓реЗрдЦ рдПрдХ рднреВрдЦ рдЦреЗрд▓рдиреЗ рдФрд░ рдмреНрд▓реЗрдЬрд╝рд░ рдХреЗ рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдЦреИрд░, рдЗрд╕рдХрд╛ рдмреЗрд╣рддрд░ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ Microsoft рд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдореИрдиреБрдЕрд▓ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

    рдзрдиреНрдпрд╡рд╛рдж


    рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдорд┐рд▓реА рд╡рд░реНрддрдиреА рдФрд░ рд╡реНрдпрд╛рдХрд░рдг рд╕рдВрдмрдВрдзреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реАрдирд┐рдХреЛрд▓рд┐рди , win32nipuh , SemenPV рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред

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


All Articles