рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рд╕рд┐рд░рджрд░реНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЛрд▓реА рд╣реИред рдпрджрд┐ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрддреНрддреЗрдЬрдХ рдХреЗ рдмрд┐рдирд╛ рдЖрдВрдЦреЛрдВ рдореЗрдВ рдПрдХ рд╕реНрд╡рд╕реНрде рд░рдВрдЧ рдФрд░ рдЪрдордХ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рд╡реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рддреЗрдВ рдХрд╣рддреЗ рд╣реИрдВ: рдЖрдХрд╛рдВрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдЬреЛ рдПрдордПрд╕рдбреАрдПрди рдкрддреНрд░рд┐рдХрд╛ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ, рдкреНрд░рд╢рдВрд╕рд╛ рдХреЗ рд╕рд╛рде рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрдВрджрд░рддрд╛ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдбреВрдм рдЧрдП рд╣реИрдВ, рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдлрд╕реЛрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рднрд╛рдЧреНрдп рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ, рдЗрд╕ рд╕реНрд╡рд░реНрдЧреАрдп рдорди рдХреА рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИрдВред рдкрд╣рд▓рд╛ рдореИрдВ рдХреЗрд╡рд▓ рдирд┐рд░реНрдгрд╛рдпрдХ рдЗрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рджреВрд╕рд░рд╛ рдореИрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рддреАрд╕рд░рд╛ рдФрд░ рдпрд╣ рд▓реЗрдЦ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИ? рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ?
рдпрд╣ рд▓реЗрдЦ рдореЗрд░реА рддрд░рд╣ рд╣реА C # / ASP.NET WebForms рдХреЙрд░реНрдкреЛрд░реЗрдЯ рд╕рд╛рдЗрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИред рдЬреЛ рд▓реЛрдЧ, рдореЗрд░реА рддрд░рд╣, рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдХрд┐ ASP.NET WebForms рд╢рд╛рдВрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрдм рдлреЙрд░реНрдо рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЯреАрдбреАрдбреАред рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реЛрдЪ рд╕рдордЭрдХрд░ рдкрдврд╝рд╛ рдЬрд╛рдПред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдкреАрдбрд╝рд┐рдд рдерд╛, рдореМрдЬреВрджрд╛ asp.net рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рджреГрд╖реНрдЯрд┐ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реЗ рд▓реЗрддрд╛ред рдЖрддреНрдордЬреНрдЮрд╛рди рдкрд░ рдЪрд░реНрдЪрд╛ рд╣реЛрдЧреАред
рдереЛрдбрд╝рд╛ рдЗрддрд┐рд╣рд╛рд╕
рдЕрдкрдиреЗ рдЧрдарди рдХреЗ рд╕рдордп, WebForms рдбреЗрд╕реНрдХрдЯреЙрдк VB рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдерд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ CommandButton, ComboBox, рдФрд░ Click Event рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░ рдЪреБрдХреЗ рдереЗ (рдореИрдВрдиреЗ рдЬрд▓реНрджрдмрд╛рдЬрд╝реА рдирд╣реАрдВ рдХреА, рдореИрдВрдиреЗ рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреА!), рдЬрд┐рд╕рдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдЕрднреВрддрдкреВрд░реНрд╡ рджрд┐рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ (рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╣рд░ рдбреЙрдЯрдХреЙрдо рдмреВрдо рдпрд╛рдж рд╣реИ?) рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрдирдХреЗ рд▓рд┐рдП, WebForms рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рд╡реЗрдм рдкрд░ RAD (рд░реИрдкрд┐рдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛: рдлреЙрд░реНрдо, рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдФрд░ рд╕реАрдЯреА рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЧреБрдЪреНрдЫрд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдгред
рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?
рдФрд░ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕ рд░реВрдк рдореЗрдВ, рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдг рдХрд░рдирд╛ рдФрд░ рд╕рд╛рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдЬрд┐рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдКрдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдЖрдХреНрд░реЛрд╢ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рдЫреБрдЖ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рд╣реИред рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдмрд▓реНрдХрд┐ ASP.NET рднреА рд╕рднреА рд╕реАрдВрдЧ рдФрд░ рдЦреБрд░реЛрдВ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ! рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдШрдЯрдирд╛рдУрдВ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рдПрд╕реНрдХреЛрдХреНрд╕ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ? рд╣рд╛рде рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рд▓реЗрдЦ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдФрд░ рдзреАрд░реЗ рд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд░рддрд╛ рд╣реВрдВред
рдкрд╣рд▓реЗ рдХреБрдЫ рдлреЛрд░рдкреНрд▓реЗ
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛, рдореВрд▓рднреВрдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛ рд░рд╣рд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдХреЛрдиреЛрдВ рдореЗрдВ рднрд╛рдЧ рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдорд╡реАрд╕реА, рдПрдорд╡реАрдкреА рдХреА рдХрд┐рд╕реНрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдХреНрдпреЛрдВрдХрд┐ MVP рдореЗрдВ, рджреГрд╢реНрдп рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рднреА рдкрд░реЛрд╕рддрд╛ рд╣реИред рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИред рдореЙрдбрд▓ рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реИред рддреЛ, MVP ASP.NET рд╡рд░реНрдХрд┐рдВрдЧ рд╕реНрдХреАрдо рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ: рд╡реНрдпреВ рдЕрднреА рднреА рдПрдХ рд╣реА рдпреВрдЬрд░ рдХрдВрдЯреНрд░реЛрд▓, рдкреНрд░реЗрдЬреЗрдВрдЯрд░ рд╣реИ, рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рд╣реИ, рдФрд░ рдореЙрдбрд▓ рднреА рдПрдХ рдХреНрд▓рд╛рд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╣реИред
рдХрд╛рдо рдХреА рд╣рдВрд╕реА рдпрд╣ рд╣реИ: рджреГрд╢реНрдп рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рд╕реЗ рддрдм рдореЙрдбрд▓ рд▓реЗрддрд╛ рд╣реИ, рдЬрдм рдЙрд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛, рдмрджрд▓реЗ рдореЗрдВ, рдЕрдиреНрдп рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдорд╛рдВрдЧ рдкрд░ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред
рдмреЗрдбрд░реВрдо рдХреА рдУрд░ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ
рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдм рдХреБрдЫ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рдЙрд╕ рдкрд░реАрдХреНрд╖рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2-3 рдЧреБрдирд╛ рд▓рдВрдмрд╛ рд╣реЛрдЧрд╛ред
рдереЛрдбрд╝рд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдПрдХ рд╕реВрдЪреА рд▓рд┐рдЦреА:
- рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдбреЛрдореЗрди (рдбреЛрдореЗрди рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдбреЛрдореЗрди, рдЕрд░реНрдерд╛рддреН рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА, рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕, рдЖрджрд┐)
- рджреЗрдЦреЗрдВ- рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ (рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рддрд░реАрдХреЗ рдХреИрд╕реЗ рджреЗрдЦреЗрдВ)
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рджреГрд╢реНрдп (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдХреМрди рд╕рд╛ рдЗрдирдкреБрдЯ рдЖрддрд╛ рд╣реИ)
рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг
- рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдбреЛрдореЗрди рдХреА рдмрд╛рддрдЪреАрдд рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХреА рдЧрдИ рд╣реИред
- рджреГрд╢реНрдп-рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдг рдЗрдХрд╛рдИ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдЕрдВрдд рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рджреГрд╢реНрдп рд╕рдВрдкрд░реНрдХ рдПрдХ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ) рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рджреГрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдмрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдореИрдВ рдХрдо рдЬрдЯрд┐рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!
рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рджреГрд╢реНрдп рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд░рдПрдХреНрд╕рдПрдХреНрд╕ рдирд┐рдпрдВрддреНрд░рдг рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ asp.net рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдПрдХ aspx рдкреГрд╖реНрда рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
System.Web.Hosting.ApplicationHost.CreateApplicationHost(Type hostType, string virtualDir, string physicalDir)
рдЬрд╣рд╛рдБ hostType MarshalByRefObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реБрдЖ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ virtualDir рдФрд░ physicalDir рдХреЛ рдХреНрд░рдорд╢рдГ рд╡рд░реНрдЪреБрдЕрд▓ рдкрде рдФрд░ рднреМрддрд┐рдХ рдкрде рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред CreateApplicationHost рдЙрд╕ рд╣реЛрд╕реНрдЯ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╕реЛрдЪреЗрдВ рдХрд┐ рд╣рдо рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЪреВрдВрдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рджреГрд╢реНрдп рдФрд░ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рдмреАрдЪ рдХреА рдмрд╛рддрдЪреАрдд рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓рд┐рдЦрдиреЗ рдФрд░ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЛ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддреЗ рд╣реБрдП рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рд╛ рд╕реЗ рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ, рдПрдХ рдкреНрд░рд╕реНрддреЛрддрд╛ рдмрдирд╛рдиреЗ, рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рд╛рде рд╣реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ, рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрджрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреЛрд╕реНрдЯрдмреИрдХ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рд╕рд╣реА рдврдВрдЧ рд╕реЗ POST рдЕрдиреБрд░реЛрдз рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ), рддреЛ рдпрд╣ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдРрдкрдбреЛрдореЗрди рдХреЗ рджреВрд╕рд░реА рддрд░рдл рд░рд╣рддрд╛ рд╣реИред
AppDomain рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕рд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, .NET рд╡рд╛рддрд╛рд╡рд░рдг рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдкреГрдердХ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, CreateApplicationHost рдПрдХ рдФрд░ AppDomain рдореЗрдВ рдПрдХ рдирдпрд╛ рд╣реЛрд╕реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реАрдзреЗ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд╡рд░реЛрдз рдХреЗ рджреВрд╕рд░реА рддрд░рдл рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рддрдХ рдХреЛрдИ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░реЙрдХреНрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреА рд╣реИрдВред рдЖрдк Google рдореЗрдВ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рдЕрдиреБрд░реЛрдз рдЬреИрд╕реЗ .net remoting рдкреНрд░реЙрдХреНрд╕реА)ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рддрд░реАрдХреЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
public class Proxy<T> : MarshalByRefObject { private readonly T _object; public Proxy(T obj) { _object = obj; } public TResult Invoke<TResult>(Func<T, TResult> selector) { return selector(_object); } public void Invoke(Action<T> action) { action(_object); } }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╡рд╛рд▓ рдпрд╣ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рд╣рдо рджреГрд╢реНрдп-рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреА рдмрд╛рддрдЪреАрдд рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд┐рд╕реА рднреА рдирдХрд▓реА рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреЙрд▓ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ
Moq рдХреЛ рдЪреБрдирд╛ред
рдФрд░ рдЖрдЦрд┐рд░реА рдПрдХ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрдВрдЯреЗрдирд░ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ: рдирдХрд▓реА-рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛, рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛, рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдЯреЗрд╕реНрдЯрдбреЗрдЯрд╛ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:
[Serializable] public class TestData { public Type MockPresenterType { get; set; } public Delegate MockPresenterInitializer { get; private set; } public void SetPresenterMockInitializer<TPresenter>(Action<Mock<TPresenter>> action) where TPresenter : class { this.MockPresenterInitializer = action; this.MockPresenterType = typeof(TPresenter); } }
рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ, рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреА рдУрд░ рд╕реЗ:- рд╣реЛрд╕реНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
- TestData рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
- рд╡рд╛рдВрдЫрд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдЯреЗрд╕реНрдЯрдбрд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
- рдирдХрд▓реА-рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдореЗрдЬрдмрд╛рди рд╕реЗ:- Default.aspx OnPreInit рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рдпрдВрддреНрд░рдг рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ
- рдЖрд╡рд╢реНрдпрдХ рдирдХрд▓реА-рдкреНрд░рд╕реНрддреЛрддрд╛ рдмрдирд╛рдПрдБ
- рдирдХрд▓реА-рдкреНрд░рд╕реНрддреЛрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдФрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рджреГрд╢реНрдп:
[TestMethod] public void UnitTestView { string physicalPath = Environment.CurrentDirectory.Substring(0, Environment.CurrentDirectory.IndexOf("bin")); TestHost host = (TestHost)ApplicationHost.CreateApplicationHost(typeof(TestHost), "/Testing", physicalDir); TestData testData = new TestData(); testData.SetPresenterMockInitializer<Presenter>( mock => { mock.Setup(m => ...); }); host.AddQueryParameter("ControlToTest", "~/OurView.ascx"); string response = host.ProcessRequest("Default.aspx", testData, null); XDocument doc = XDocument.Parse(response); host.GetPresenterMock<Presenter>().Invoke(mock => mock.Verify(m => m.SomeMethodRan(), Times.Once())); }
рд╣реЛрд╕реНрдЯ рдХреА рдУрд░ рд╕реЗ, Default.aspx.cs рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ:
public class Default : Page, IRequiresSessionState { private readonly PlaceHolder _phContent = new PlaceHolder(); protected override void FrameworkInitialize() { this.Controls.Add(new LiteralControl(@"<!DOCTYPE html><html><body>")); var form = new HtmlForm(); this.Controls.Add(form); form.Controls.Add(_phContent); this.Controls.Add(new LiteralControl(@"</body></html>")); } protected override void OnPreInit(EventArgs e) { base.OnPreInit(e); var controlToTest = this.Request.QueryString["ControlToTest"]; var testData = (TestData)this.Context.Items["TestData"]; if (controlToTest != null) { Control c = this.LoadControl(controlToTest); Type viewType = get view type from that control if (viewType != null) { object presenter; if (testData.MockPresenterType != null) { var mockType = typeof(Mock<>).MakeGenericType(testData.MockPresenterType); object mock = Activator.CreateInstance(mockType); AppDomain.CurrentDomain.SetData("PresenterMock", mock); presenter = mockType.GetProperty("Object", testData.MockPresenterType).GetValue(mock, null); testData.MockPresenterInitializer.DynamicInvoke(mock); viewType.GetProperty("Presenter").SetValue(c, presenter, null); AppDomain.CurrentDomain.SetData("Presenter", presenter); _phContent.Controls.Add(c); } }
рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╡реНрдпреВ рдЯрд╛рдЗрдк рдЦреЛрдЬ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реИ (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдпрд╣ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдПрдорд╡реАрдкреА рдкреИрдЯрд░реНрди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ)ред рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рд╣реИрдВ
- рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдирд╛ рдФрд░ рдЬреЛрдбрд╝рдирд╛ QueryString рдХреЗ рдкрд╛рд╕ рдЧрдпрд╛
- рдПрдХ MockPresenter рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ AppDomain.SetData рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ AppDomain рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред AppDomain.GetData рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ MockPresenter рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВрдЧреЗ
- рдбрд╛рдпрдирд╛рдорд┐рдХрдЗрдирд╡реЛрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЬреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ (рдореЙрдХ => mock.Setup ...)
рд╕рд╛рдереА рдЯреЗрд╕реНрдЯрд╣реЙрд╕реНрдЯ рд╡рд░реНрдЧ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
public class TestHost : MarshalByRefObject { private readonly Dictionary<string, string> _query = new Dictionary<string, string>(); public void AddQueryParameter(string key, string value) { _query.Add(key, HttpUtility.UrlEncode(value)); } private string GetQueryParameters() { StringBuilder sb = new StringBuilder(); foreach (var parameter in _query) { sb.AppendFormat("{0}={1}&", parameter.Key, parameter.Value); } return sb.ToString(); } public string ProcessRequest(string page, TestData testData, string postData) { StringWriter writer = new StringWriter(); TestRequest swr = new TestRequest(page, GetQueryParameters(), writer, testData, postData); HttpRuntime.ProcessRequest(swr); writer.Close(); return writer.ToString(); } public Proxy<Mock<TPresenter>> GetPresenterMock<TPresenter>() where TPresenter : class { object mock = AppDomain.CurrentDomain.GetData("PresenterMock"); return new Proxy<Mock<TPresenter>>((Mock<TPresenter>)mock); } } public class TestRequest : SimpleWorkerRequest { private readonly TestData _testData; private readonly byte[] _postData; private const string PostContentType = "application/x-www-form-urlencoded"; public TestRequest(string page, string query, TextWriter output, TestData testData, string postData) : base(page, query, output) { _testData = testData; if (!string.IsNullOrEmpty(postData)) _postData = Encoding.Default.GetBytes(postData); } public override void SetEndOfSendNotification(EndOfSendNotification callback, object extraData) { base.SetEndOfSendNotification(callback, extraData); HttpContext context = extraData as HttpContext; if (context != null) { context.Items.Add("TestData", _testData); } } public override string GetHttpVerbName() { if (_postData == null) return base.GetHttpVerbName(); return "POST"; } public override string GetKnownRequestHeader(int index) { if (index == HeaderContentLength) { if (_postData != null) return _postData.Length.ToString(); } else if (index == HeaderContentType) { if (_postData != null) return PostContentType; } return base.GetKnownRequestHeader (index); } public override byte[] GetPreloadedEntityBody() { if (_postData != null) return _postData; return base.GetPreloadedEntityBody(); } }
рдзреБрдЖрдВ рдЯреВрдЯрдирд╛
рдпрд╣ рд╕рдм рд╣реИ, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА asp.net webforms рдХреЗ рд▓рд┐рдП рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг (рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛) рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рддреЛ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓, рд╣рд░ рддрд░рд╣ рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдЕрдореЗрд░рд┐рдХреА рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдм рдпрд╣ рд╕рдВрднрд╡ рд╣реИред
рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рдкреНрд░реВрдл-рдСрдл-рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЬрд░реВрд░реА рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯрдмреИрдХ рдмрдирд╛рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рд╕рд╛рде рд╣реА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред рдпрджрд┐ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдорд╡реАрдкреА рдХреЗ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдФрд░ рдЕрдиреНрдп 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд╣реИрдВред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред