рд╢реБрдн рджреЛрдкрд╣рд░
рдореИрдВрдиреЗ рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ WPF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред MVVM рдкреИрдЯрд░реНрди рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкреИрдЯрд░реНрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдПрдорд╡реАрд╕реА рд▓рдЧрднрдЧ рдПрдХ рд╣реА рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдПрдорд╡реАрд╕реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрд╛рдо рдХреЗ рдПрдХ рдирдП рд╕реНрдерд╛рди рдкрд░ рджреЗрдЦрд╛, рддреЛ рдореБрдЭреЗ рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдЙрд╕реА рд╕рдордп рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рдпреЛрдЬреНрдп рдХреА рдХрдореА рдкрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрд╖реНрдЯрдкреНрд░рдж рдпрд╣ рд╣реИ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХреЗрд╡рд▓ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдлреЙрд░реНрдо рдУрд╡рд░рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред рдЬрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ, рдЙрд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдИ рд▓рд╛рд▓ рдлреНрд░реЗрдо рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдПрдХ рдЪреЗрддрд╛рд╡рдиреАред рдпрджрд┐ рдмрд╣реБрдд рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред рд╕реЗрд╡ рдмрдЯрди рд╣рдореЗрд╢рд╛ рд╕рдХреНрд░рд┐рдп рд░рд╣рддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпрд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ js рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдЯрд┐рд▓ рдФрд░ рднреНрд░рд╛рдордХ рд╣реИред рдореЙрдбрд▓, рджреГрд╢реНрдп, рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдХрд╕рдХрд░ рдпреБрдЧреНрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕рдм рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗ рдорд╣рд┐рдорд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрд╛ рдЬрд╛рдП ?? рдпрд╣ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдореИрдВ рдХреИрдЯ рдХреЗ рддрд╣рдд рдкреВрдЫрддрд╛ рд╣реВрдВред
рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕:
рдХреНрд▓рд╛рд╕рд┐рдХ рд░реВрдк рдореЗрдВ рдПрдорд╡реАрд╕реА рд░реВрдкреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреВрд░реЗ рдкреГрд╖реНрда рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред
Reart, Angular, Vue рдФрд░ TransPage рдХреЗ рд▓рд┐рдП SinglePageApplicatrion рдЬреИрд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
-рдордиреА рдХреЛрдб рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░рдиреЗ рдирд╣реАрдВ рджреЗрдЧрд╛ред
-рд╣рдо C # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ рдФрд░ рд╕рд╣реА рдорд╛рддреНрд░рд╛ рдореЗрдВ js рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП Reart, Angular, Vue рдЪреМрдЦрдЯреЗ рдХреЛ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдореЗрд░реЗ WPF рд▓реБрдХ рдореЗрдВ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рд╕рднреА рддрд░реНрдХ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд╕реНрддреБ рдФрд░ / рдпрд╛ рдореЙрдбрд▓ рд╡рд░реНрдЧ рд╣реИред рджреГрд╢реНрдп рдХреЛ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреВрд░реНрд╡рдЧрд╛рдореА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреЛ рдЖрдкрдХреЛ рдиреНрдпреВрдирддрдо рдЬреЗрдПрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрддрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдиреНрдпреВрдирддрдо рдХреЛрдб рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд VueJs + MVC рдмрдВрдбрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
- VueJs cdn рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдШрдЯрдХ рд╕реАрдбреАрдПрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
- рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, Vue рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЛ рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
- рд╣рд░ рдмрд╛рд░ рдЬрдм рдкреНрд░рдкрддреНрд░ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ Vue рд╕рд░реНрд╡рд░ рдХреЛ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рднреЗрдЬрддрд╛ рд╣реИ (рдкрд╛рда рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝реЛрдХрд╕ рдЦреЛ рдЬрд╛рдиреЗ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ)ред
- рдЗрдХрд╛рдИ рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╡реИрдзрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЕрдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИред
-рдЕрдЧрд░ рдЕрдЧрд▓рд╛ рд╕рддреНрдпрд╛рдкрди рдЕрдиреБрд░реЛрдз рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд┐рдЫрд▓рд╛ рд╕рддреНрдпрд╛рдкрди рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдорд╡реАрд╕реА рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред WPF рдЕрд░реНрдереЛрдВ рдореЗрдВ ViewModel рдлрд╝рдВрдХреНрд╢рди рдпрд╣рд╛рдБ vue рдФрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдмреАрдЪ рдзреБрдВрдзрд▓рд╛ рд╣реИред
рдХреНрд▓рд╛рд╕рд┐рдХ рд░реЗрдЬрд░ рдкреЗрдЬ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдлрд╛рдпрджреЗ: - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Vue рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдбреНрд░рд╛рдЗрдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЦреНрдп рд▓рд╛рднред
- ViewModel рд╕реЗ рдЕрд▓рдЧ рдкрд░рддреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред
- рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЙрд░реНрдо рднрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╕реБрд╡рд┐рдзрд╛ рдкрд░реАрдХреНрд╖рдг
рдиреБрдХрд╕рд╛рди: - рд╕рддреНрдпрд╛рдкрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рднрд╛рд░ред
рдПрдХ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдФрд░ рдЬреЗрдПрд╕ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдирддрд╛ рд╣реВрдВред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡реЗрджрди рдореЗрдВ, рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ:
1) рдлрд╝реАрд▓реНрдб рдмрджрд▓рддреЗ рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
2) рд╕рддреНрдпрд╛рдкрди рд▓рдВрдмрд╛ рд╣реИ, рдХреНрд╖реЗрддреНрд░ рднрд░реЗ рд╣реБрдП рд╣реИрдВ, рдЖрджрд┐ред рдЧреНрд░рд╛рд╣рдХ рдкрд░ рдЪрд▓рд╛рдПрдВред
рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред
рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдиреЙрд░реНрдерд╡рд┐рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдбреЗрд╡реЗрдХреНрд╕рдЯреНрд░реЗрдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд░реНрдорд╛рдг, рдЗрдХрд╛рдИ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдФрд░ DbContext I рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЬреАрдердм рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред
рдПрдХ рдирдпрд╛ рдЦрд╛рд▓реА MVC 5 рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рдПрдВред рдЗрд╕реЗ OrdersController рдХрд╣реЗрдВред рдЗрд╕рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдЕрднреА рддрдХ рд╣реИред
public ActionResult Index() { return View(); }
рдПрдХ рдФрд░ рдЬреЛрдбрд╝реЗрдВ
public ActionResult Edit() { return View(); }
рдЕрдм рдЖрдкрдХреЛ рджреГрд╢реНрдп / рдЖрджреЗрд╢ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдиреЗ рдФрд░ рджреЛ рдкреЗрдЬ Index.cshtml рдФрд░ Edit.cshtml рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ cshtml рдкреГрд╖реНрда рдмрд┐рдирд╛ рдХрд┐рд╕реА рдореЙрдбрд▓ рдХреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП System.Web.Mvc.WebViewPage рдкреГрд╖реНрдаред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ Index.cshtml рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреА рдЧрдИ рдкрдВрдХреНрддрд┐ рд╕рдВрдкрд╛рджрди рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдЧреАред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдмрд╕ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдБ рдЬреЛ рд╕рдВрдкрд╛рджрди рдкреГрд╖реНрда рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред
@inherits System.Web.Mvc.WebViewPage <table > @foreach (var item in ViewBag.Orders) { <tr><td><a href="Edit?id=@item.OrderID">@item.OrderID</a></td></tr> } </table>
рдЕрдм рдореИрдВ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ Json рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рд╡рд┐рд╡рд░рдг рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
[HttpGet] public ActionResult GetById(int id) { var order = _db.Orders.Find(id);
рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдкреЛрд░реНрдЯ рдирдВрдмрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдкрдХрд╛ рд╣реИ) http: // localhost: 63164 / рдЖрджреЗрд╢ / GetById? рдЖрдИрдбреА = 10501
рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
{ "OrderID": 10501, "CustomerID": "BLAUS", "EmployeeID": 9, "OrderDate": "1997-04-09T00:00:00", "RequiredDate": "1997-05-07T00:00:00", "ShippedDate": "1997-04-16T00:00:00", "ShipVia": 3, "Freight": 8.85, "ShipName": "Blauer See Delikatessen", "ShipAddress": "Forsterstr. 57", "ShipCity": "Mannheim", "ShipRegion": null, "ShipPostalCode": "68306", "ShipCountry": "Germany" }
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ (рдпрд╛) рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рдЦрдирд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рдкрд░реАрдХреНрд╖рдг рдЫреЛрдбрд╝ рджреЗрдВред
[Test] public void OrderControllerGetByIdTest() { var bdContext = new Northwind(); var id = bdContext.Orders.First().OrderID;
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдПрдХ Vue рдлреЙрд░реНрдо рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
@inherits System.Web.Mvc.WebViewPage <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title> </title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> <h1>A </h1> <table > <tr v-for="(item,i) in order"> @* *@ <td> {{i}}</td> <td> <input type="text" v-model="order[i]"/> </td> </tr> </table> </div> <script> new Vue({ el: "#app", data: { order: { OrderID: 10501, CustomerID: "BLAUS", EmployeeID: 9, OrderDate: "1997-04-09T00:00:00", RequiredDate: "1997-05-07T00:00:00", ShippedDate: "1997-04-16T00:00:00", ShipVia: 3, Freight: 8.85, ShipName: "Blauer See Delikatessen", ShipAddress: "Forsterstr. 57", ShipCity: "Mannheim", ShipRegion: null, ShipPostalCode: "68306", ShipCountry: "Germany" } } }); </script> </body> </html>
рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Vue рдиреЗ рд╕рднреА рдлрд╝реАрд▓реНрдб рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬреИрд╕реЗ рдореЙрдбрд▓ рдерд╛ред рд▓реЗрдХрд┐рди рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрднреА рднреА рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдХреЗрд╡рд▓ рд▓рд┐рдЦреА рдЧрдИ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, fetchOrder () рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдШреБрдбрд╝рд╕рд╡рд╛рд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ:
new Vue({ el: "#app", data: { id: @ViewBag.Id, order: { OrderID: 0, CustomerID: "", EmployeeID: 0, OrderDate: "", RequiredDate: "", ShippedDate: "", ShipVia: 0, Freight: 0, ShipName: "0", ShipAddress: "", ShipCity: "", ShipRegion: null, ShipPostalCode: "", ShipCountry: "" }, }, methods: {
рдЦреИрд░, рдЪреВрдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЕрдм рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЖрдкрдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЧрддрд┐рд╢реАрд▓ ViewBag рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ рд╡реНрдпреВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
public ActionResult SimpleEdit(int id = 0) { ViewBag.Id = id; return View(); }
рдпрд╣ рдмреВрдЯ рд╕рдордп рдкрд░ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдлреЙрд░реНрдо рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдЦ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдиреНрдпреВрдирддрдо рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛рдЯрд╛ред рдореИрдВ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред
<table > <tr> <td> </td> <td > <input type="number" v-model="order.Freight" /> </td> </tr> <tr> <td> </td> <td> <input type="text" v-model="order.ShipCountry" /> </td> </tr> <tr> <td> </td> <td> <input type="text" v-model="order.ShipCity" /> </td> </tr> <tr> <td> </td> <td> <input type="text" v-model="order.ShipAddress" /> </td> </tr> </table>
рд╢рд┐рдкрдХрд╛рдЙрдВрдЯреНрд░реА рдФрд░ рд╢рд┐рдкрдЕрдбреНрд░реЗрд╕ рдлреАрд▓реНрдб рд▓рд┐рдВрдХреНрдб рд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред
рдпрд╣рд╛рдБ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╕рднреА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ Linq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рджреЗрдЦреЗрдВ рдХреЛрдб рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рджреЗрд╢реЛрдВ рдФрд░ рд╢рд╣рд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рдШрдбрд╝реА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдЬрдЯрд┐рд▓ vue рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреБрд░рд╛рдирд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ saveldldOrderValue рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛: рдЬрдмрдХрд┐ рдореИрдВ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЗрд╢ рдмрдЪрд╛рддрд╛ рд╣реВрдВред рдпрд╣ рдЖрдкрдХреЛ рд╢рд╣рд░реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рджреЗрд╢ рдмрджрд▓рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдХреЛрдб рд╕рдорд╛рди рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ-рд╕реНрддрд░реАрдп рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рджрд┐рдЦрд╛рдИ (рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдХрд╛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ)ред
@inherits System.Web.Mvc.WebViewPage <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title> </title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> <table> <tr> <td>C </td> <td> <input type="number" v-model="order.Freight" /> </td> </tr> <tr> <td> </td> <td> <select v-model="order.ShipCountry" class="input"> <option v-for="item in AvaialbeCountrys" :v-key="item">{{item}} </option> </select> </td> </tr> <tr> <td> </td> <td> <select v-model="order.ShipCity" > <option v-for="city in AvaialbeCitys" :v-key="city">{{city}} </option> </select> </td> </tr> <tr> <td> </td> <td> <input type="text" v-model="order.ShipAddress" /> </td> </tr> </table> </div> <script> new Vue({ el: "#app", data: { id: @ViewBag.Id, order: { OrderID: 0, CustomerID: "", EmployeeID: 0, OrderDate: "", RequiredDate: "", ShippedDate: "", ShipVia: 0, Freight: 0, ShipName: "0", ShipAddress: "", ShipCity: "", ShipRegion: null, ShipPostalCode: "", ShipCountry: "" }, oldOrder: { ShipCountry: "" }, AvaialbeCitys: [], AvaialbeCountrys: [] }, methods: { </script> </body> </html>
рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рдорд╛рдиреНрдпрддрд╛ рд╣реИред рдЧрддрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╕рддреНрдпрд╛рдкрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдВрдЯрд┐рдЯреА рд╕реНрддрд░ рдкрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реВрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдиреНрдпреВрдирддрдо рдХреЛрдб, рд╕рддреНрдпрд╛рдкрди рд╕реНрд╡рдпрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рднреА рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рддрднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдкрд╛рда рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЧрддрд┐ 260 рд╡рд░реНрдг рдкреНрд░рддрд┐ рдорд┐рдирдЯ рд╣реИред рдкрд╛рда рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЖрд▓рд╕реА рдЕрджреНрдпрддрди v-model .lazy = "order.ShipAddress" рд╕реЗрдЯ рдХрд░рдирд╛, рддрдм рд╕рддреНрдпрд╛рдкрди рддрдм рд╣реЛрдЧрд╛ рдЬрдм рдлрд╝реЛрдХрд╕ рдмрджрд▓рддрд╛ рд╣реИред рдПрдХ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╡рд┐рдХрд▓реНрдк рдЗрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рджреЗрд░реА рдХрд░рдирд╛ рд╣реИ + рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд▓рд╛ рд╕рддреНрдпрд╛рдкрди рдЕрдиреБрд░реЛрдз рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВред
рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рддрд░реАрдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдереЗред
[HttpGet] public ActionResult Validate(int id, string json) { var order = _db.Orders.Find(id); JsonConvert.PopulateObject(json, order); var errorsD = GetErrorsJsArrey(); return Content(errorsD.ToString(), "application/json"); } private String GetErrorsAndChanged() { var changed= _db.ChangeTracker.HasChanges(); var errors = _db.GetValidationErrors(); return GetErrorsAndChanged(errors,changed); } private static string GetErrorsAndChanged(IEnumerable<DbEntityValidationResult> errors,bool changed) { dynamic dynamic = new ExpandoObject(); dynamic.IsChanged = changed;
DynObject
public sealed class DynObject : DynamicObject { private readonly Dictionary<string, object> _properties; public DynObject(Dictionary<string, object> properties) { _properties = properties; } public override IEnumerable<string> GetDynamicMemberNames() { return _properties.Keys; } public override bool TryGetMember(GetMemberBinder binder, out object result) { if (_properties.ContainsKey(binder.Name)) { result = _properties[binder.Name]; return true; } else { result = null; return false; } } public override bool TrySetMember(SetMemberBinder binder, object value) { if (_properties.ContainsKey(binder.Name)) { _properties[binder.Name] = value; return true; } else { return false; } } }
рдХрд╛рдлреА рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдирд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, IsChanded рдФрд░ Errors рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде json рдСрдмреНрдЬреЗрдХреНрдЯред рдЗрди рдЧреБрдгреЛрдВ рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ Vue рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХрд░рдиреЗ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдХрд╣реАрдВ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдСрд░реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЗрдХрд╛рдИ рдХреЗ рд╣рдорд╛рд░реЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдХреБрдЫ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
[MinLength(10)] [StringLength(60)] public string ShipAddress { get; set; } [CheckCityAttribute(" ShipCity ")] public string ShipCity { get; set; }
MinLength рдФрд░ StringLength рдорд╛рдирдХ рдЧреБрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди ShipCity рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдИ
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдЗрдП рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рдмрд╛рд╣рд░ рдЗрдХрд╛рдИ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рднреА рдЫреЛрдбрд╝ рджреЗрдВред
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реАрдПрд╕рдПрд╕ рд╕реЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдлрд╝реЙрд░реНрдо рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рдВрд╢реЛрдзрд┐рдд рд░реВрдк рдХреЛ рдЕрдм рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
@inherits System.Web.Mvc.WebViewPage <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title> id=@ViewBag.Id</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <link rel="stylesheet" type="text/css" href="~/Content/vueError.css" /> </head> <body> <div id="app"> <table> <tr> <td> </td> <td class="tooltip"> <input type="number" v-model="order.Freight" v-bind:class="{error:!errors.Freight==''} " class="input" /> <span v-if="errors.Freight!==''" class="tooltiptext">{{errors.Freight}}</span> </td> </tr> <tr> <td> </td> <td> <select v-model="order.ShipCountry" class="input"> <option v-for="item in AvaialbeCountrys" :v-key="item">{{item}} </option> </select> </td> </tr> <tr> <td> </td> <td class="tooltip"> <select v-model="order.ShipCity" v-bind:class="{error:!errors.ShipCity==''}" class="input"> <option v-for="city in AvaialbeCitys" :v-key="city">{{city}} </option> </select> <span v-if="!errors.ShipCity==''" class="tooltiptext">{{errors.ShipCity}}</span> </td> </tr> <tr> <td> </td> <td class="tooltip"> <input type="text" v-model.lazy="order.ShipAddress" v-bind:class="{error:!errors.ShipAddress=='' }" class="input" /> <span v-if="!errors.ShipAddress==''" class="tooltiptext">{{errors.ShipAddress}}</span> </td> </tr> <tr> <td> </td> <td> <button v-on:click="Save()" :disabled="IsChanged===false" || hasError class="alignRight">Save</button> </td> </tr> </table> </div> <script> new Vue({ el: "#app", data: { id: @ViewBag.Id, order: { OrderID: 0, CustomerID: "", EmployeeID: 0, OrderDate: "", RequiredDate: "", ShippedDate: "", ShipVia: 0, Freight: 0, ShipName: "0", ShipAddress: "", ShipCity: "", ShipRegion: null, ShipPostalCode: "", ShipCountry: "" }, oldOrder: { ShipCountry: "" }, errors: { OrderID: null, CustomerID: null, EmployeeID: null, OrderDate: null, RequiredDate: null, ShippedDate: null, ShipVia: null, Freight: null, ShipName: null, ShipAddress: null, ShipCity: null, ShipRegion: null, ShipPostalCode: null, ShipCountry: null }, IsChanged: false, AvaialbeCitys: [], AvaialbeCountrys: [] }, computed : { hasError: function () { for (var err in this.errors) { var error = this.errors[err]; if (error !== '' || null) return true; } return false; } }, methods: { </script> </body> </html>
рдпрд╣ рд╕реАрдПрд╕рдПрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
.tooltip { position: relative; display: inline-block; border-bottom: 1px dotted black; } .tooltip .tooltiptext { visibility: hidden; width: 120px; background-color: #555; color: #fff; text-align: center; border-radius: 6px; padding: 5px 0; position: absolute; z-index: 1; bottom: 125%; left: 50%; margin-left: -60px; opacity: 0; transition: opacity 0.3s; } .tooltip .tooltiptext::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #555 transparent transparent transparent; } .tooltip:hover .tooltiptext { visibility: visible; opacity: 1; } .error { color: red; border-color: red; border-style: double; } .input { width: 200px ; } .alignRight { float: right }
рдФрд░ рдпрд╣рд╛рдБ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдЗрдП рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ:
<td class="tooltip"> <input type="number" **v-model="order.Freight" v-bind:class="{error:!errors.Freight==''} " **class="input" /> <span v-if="errors.Freight!==''" class="tooltiptext">{{errors.Freight}}</span> </td>
рдпрд╣рд╛рдБ 2 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИрдВ:
рдорд╛рд░реНрдХрдЕрдк рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ v-bind рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд▓рд╛рд▓ рдмреЙрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕реНрдЯрд╛рдЗрд▓ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ : class = "{error: Errors.Freight == ''} рдпрд╣рд╛рдБ vss css рдХреНрд▓рд╛рд╕ рдХреЛ рдХрдВрдбреАрд╢рди рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдПрдХ рддрддреНрд╡ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ:
<span v-if="errors.Freight!==''" class="tooltiptext">{{errors.Freight}}</span>
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рддрддреНрд╡ рдореВрд▓ рддрддреНрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд░реНрдЧ = "рдЯреВрд▓рдЯрд┐рдк" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╕реЗрд╡ рдмрдЯрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рддрднреА рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрдм рдмрдЪрдд рд╕рдВрднрд╡ рд╣реЛред
рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдШрдЯрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╕рднреА рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЕрдкрдиреЗ рдКрдкрд░ рд▓реЗ рд▓реЗред
Vue.component('error-aborder', { props: { error: String }, template: '<div class="tooltip" >' + '<div v-bind:class="{error:!error==\'\' }" >' + '<slot>test</slot>' + '</div>' + '<p class="tooltiptext" v-if="!error==\'\'" >{{error}}</p>' + '</div>' });
рдЕрдм рдорд╛рд░реНрдХрдЕрдк рдЕрдзрд┐рдХ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
<error-aborder v-bind:error="errors.Freight"> <input type="number" v-model="order.Freight" class="input" /> </error-aborder>
рд╡рд┐рдХрд╛рд╕ рдПрдХ рдлреЙрд░реНрдо рдкрд░ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ, рдПрдиреНрдЯреАрдЯреА рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдпрджрд┐ рд╕реВрдЪрд┐рдпрд╛рдВ рд╕реНрдерд┐рд░ рд╣реИрдВ рдФрд░ рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЛрдб рдХрд╛ C # рднрд╛рдЧ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЧрд╛рдореА рдпреЛрдЬрдирд╛рдПрдВ Vue рдкрд░реАрдХреНрд╖рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред
рдпрд╣реА рд╕рдм рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдореИрдВ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдВрдЧрд╛ред
рдпрд╣рд╛рдВ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлреЙрд░реНрдо рдХреЛ SimpleEdit рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдХрдорд┐рдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛: рд╕рддреНрдпрд╛рдкрди рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рддреЗ рд╣реБрдП, рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рд╕рддреНрдпрд╛рдкрди рджреВрд╕рд░реА рдмрд╛рд░ рд╣реЛред