рдЬрдЯрд┐рд▓ ASP.NET MVC рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдиреЗ рдЕрдкрдиреЗ asp.net mvc control рдмрдирд╛рдП (рдмреЗрд╢рдХ, рд╣рдо asp.net mvc encoders рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдЖрдкрдХреЛ рдЯреИрдЧрдмреНрдпреВрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдирд┐рдпрдВрддреНрд░рдг рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде, рдЬреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)? рддрдм рдЖрдк рд╢рд╛рдпрдж рдЙрджреНрдзрд░рдгреЛрдВ рд╕реЗ рдмрдЪ рдирд┐рдХрд▓рдиреЗ, рддрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ (рдпрд╛ рдХреЙрд▓рд┐рдВрдЧ .рдлреЙрд░реНрдо) (рдХрд╛рд░реНрдпреЛрдВ), рдЖрджрд┐ рдХреЗ рдирд░рдХ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред "рдЕрд╕реБрд╡рд┐рдзрд╛"ред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рддрдХрдиреАрдХ рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдРрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░ рд╕рд╛рде рд╣реА рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрдХреНрд╖ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛, рди рдХрд┐ рднреВрд╕реА рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ред

рддреНрдпрд╛рдЧ


рдпрд╣рд╛рдБ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдмрд╣реБрдд рдХреБрдЫ рдЬрдВрдЧрд▓реА рдмрдЯрди рдФрд░ рдЧреЛрд╡рд╛рдиреЛрдХреЙрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдХрд╛рдлреА рд╣реИрд░рд╛рди рд╣реИрдВред рдпрд╣ рдПрдХ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдирд╣реАрдВ рд╣реИ, рди рд╣реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рдЕрднрд┐рдпрд╛рди рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред

ASP.NET MVC рдирд┐рдпрдВрддреНрд░рдг рдХреНрд▓рд╛рд╕рд┐рдХ


рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдЕрдм рдореВрд░реНрддрд┐рдХрд▓рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ HtmlHelper рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд░рддреЗ рд╣реИрдВ:
public static string InputExControl(this HtmlHelper @this) { StringBuilder sb = new StringBuilder(); sb.Append("<input type=\"text\">.......blablabla.........."); return sb.ToString(); } 

рдпрд╛ рддреЛ рдПрдХ рд╣реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП TagBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 public static string InputExControl(this HtmlHelper @this) { TagBuilder tagBuilder = new TagBuilder("input"); //.....blablabla.... return tagBuilder.ToString(); 


рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдореБрдЭреЗ рдЗрд╕ рдХреЛрдб рд╕реЗ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ: рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (IMHO), рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдЕрджреНрдпрддрди рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

рдХрд╛рд░реНрдп


рдЖрдЗрдП рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ: рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ AJAX рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рджрд┐рдП рдЧрдП Regexp рдХреЗ рдЖрдзрд╛рд░ рдкрд░), рд╕рддреНрдпрд╛рдкрди рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╣реИред рдпрд╣ рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рджрд┐рдЦрд╛рдПрдЧрд╛ред

рджреВрд╕рд░реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?


рдкрд╣рд▓реЗ, рдЖрдЗрдП рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ рдХрд┐ рд╡реЗ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:


рдЕрдиреНрдп рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдореБрдЦреНрдп рд░реВрдк рд╕реЗ "StringBuilder.Format ()" рджреГрд╖реНрдЯрд┐рдХреЛрдг (рд╢реБрджреНрдз asp.net mvc рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди (DevExpress рдХреА рддрд░рд╣) asp.net webForms рдирд┐рдпрдВрддреНрд░рдг рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рдЪрд╛рд░


рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ .cshtml рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдЬрд╝рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ asp.net mvc рдЖрдВрд╢рд┐рдХ рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рд╕рд╛рде .cshtml рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рди рдЦреАрдВрдЪреЗрдВ, рдЕрд╡рд╢реНрдпред

рдЪрд▓реЛ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдПрдХ рд╕рд░рд▓ asp.net mvc 4 рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдЪрд▓реЛ рдЗрд╕реЗ MyControlLib рдХрд╣рддреЗ рд╣реИрдВ), рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдореВрд▓ asp.net mvc 4 lib рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

MyControlLib рдореЗрдВ InputExControl.cshtml lib рдореЗрдВ рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЯреИрдЧрдмреНрдпреВрд▓рд░ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдерд╛ред рдЗрд╕ cshtml рдлрд╝рд╛рдЗрд▓ рдХреЛ C # рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░реЗрдЬрд░ рдЬреЗрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╣рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рд░реЗрдЬрд░ рдЗрдВрдЬрди рдПрдХ asp.net mvc рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдлреНрд▓рд╛рдИ рдкрд░ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ .shtml рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рди рд▓реЗ рдЬрд╛рдПрдВ рдФрд░ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛ рдХрд┐ "рд╡рдпрд╕реНрдХ рдирд┐рдпрдВрддреНрд░рдг" (рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╡рд╛рд▓реЗ рдЦреАрдВрдЪ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд╣реАрдВ рдЬреАрддреЗ)ред рдареАрдХ рд╣реИ, InputExControl.cshtml рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд╛рд▓реЗрдВ:
 @* Generator: MvcView *@ 

, рдФрд░ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рд╣рдо RazorGenerator рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╕реНрдЯрдо рдЯреВрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗред

System.Web.Mvc.WebViewPage рд╕реЗ рдЙрддреНрдкрдиреНрди рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╡рд░реНрдЧ рдорд┐рд▓рд╛ред рдкреАрдврд╝реА рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ (рдЬреЗрдирд░реЗрдЯрд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдпрд╛ рдХреЗрд╡рд▓ рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рд╛рде рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдЕрд░реНрдерд╛рддред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ

рдЪрд▓реЛ рд╡рд░реНрдЧ InputExControlSettings рдмрдирд╛рдПрдБ , рдЬреЛ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛:
  public class InputExControlSettings { public string Name { get; set; } //  public dynamic CallbackRouteValues { get; set; } //  ajax callback- public string ValidationRegexp { get; set; } //   } 

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

Uri рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ CallbackRouteValues рдкреНрд░реЙрдкрд░реНрдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВрдЧреЗред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрдм рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╡рд░реНрдЧ рдХреЛ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг- cshtml рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 @* Generator: MvcView *@ @model InputExControlSettings @{ //     ,       string controlId = Model.Name; string controlResultId = Model.Name + "_Result"; } 


рдХреЛрдб рдХреЛ рдЖрдЧреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдмрд╛рдд рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреЙрд▓рдмреИрдХ рдЖрдорддреМрд░ рдкрд░ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╕рд╛рдзрд╛рд░рдг GET рдЕрдиреБрд░реЛрдз рд╕реЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛, рдореИрдВрдиреЗ рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ "рд╡рд┐рд╢реЗрд╖" (рд╣рдорд╛рд░реЗ) рдореВрд▓реНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЪреБрдирд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рдорд┐рд▓рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ (рдмреБрд░рд╛ рдХреЛрдб!) рдХреЙрд▓рдмреИрдХRouteValues рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдЙрд░реА рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ:
  internal static class InputExControlHelper { public static bool IsCallback() { return !string.IsNullOrEmpty(HttpContext.Current.Request.Headers["InputExControAjaxRequest"]); } public static MvcHtmlString CallbackHeaderName { get { return MvcHtmlString.Create("InputExControAjaxRequest"); } } public static string GetUrl(dynamic routeValues) { if (HttpContext.Current == null) throw new InvalidOperationException("no context"); RequestContext context; if (HttpContext.Current.Handler is MvcHandler) { context = ((MvcHandler) HttpContext.Current.Handler).RequestContext; } else { var httpContext = new HttpContextWrapper(HttpContext.Current); context = new RequestContext(httpContext, new RouteData()); } var helper = new UrlHelper(context, RouteTable.Routes); return helper.RouteUrl(string.Empty, new RouteValueDictionary(routeValues)); } } 


рдареАрдХ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:
cshtml рджреЗрдЦреЗрдВ рдХреЛрдб
 @* Generator: MvcView *@ @model InputExControlSettings @{ string controlId = Model.Name; string controlResultId = Model.Name + "_Result"; } @if(!InputExControlHelper.IsCallback()) { <input type="text" id="@controlId"/> <span id="@controlResultId"></span> <script> $(function() { $('#@controlId').change(function () { $('#@controlResultId').text('validating ...'); $.ajax({ url: '@InputExControlHelper.GetUrl(Model.CallbackRouteValues)', headers: { '@InputExControlHelper.CallbackHeaderName': true }, cache: false, data: { value: $('#@controlId').val() }, type: 'POST', dataType: 'json', success: function (data) { if (data) { $('#@controlResultId').text('Validattion result: ' + data.result); } else { alert('result error?'); } }, error: function() { alert('ajax error'); } }); }); }); </script> } else { System.Web.HttpContext.Current.Response.ContentType = "application/json"; @(this.InternalValidate(System.Web.HttpContext.Current.Request.Form["value"])) } 



рдпрд╣ рдХреЛрдб рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ, рддреЛ рд╣рдо рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╣рд┐рдд рдореБрдЦреНрдп рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдХрд░реЗрдЧрд╛ред рдХреЙрд▓рдмреИрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо ContentType рдХреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ InternalValidate(string) ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, ViewData.Model рдХреА рдорд╛рдиреНрдпрддрд╛ рдФрд░ рд╕реНрдерд╛рдкрдирд╛ рдХрд╛ рдХреЛрдб рдЦреБрдж рдПрдХ рдЖрдВрд╢рд┐рдХ InputExControl рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛:
 partial class InputExControl { public InputExControl(InputExControlSettings settings) { ViewData.Model = settings; } private MvcHtmlString InternalValidate(string value) { Thread.Sleep(2000); //long validation emulator... var settings = ViewData.Model; var regexp = new Regex(settings.ValidationRegexp, RegexOptions.Compiled); var res = regexp.IsMatch(value); var scriptSerializer = new JavaScriptSerializer(); var rv = scriptSerializer.Serialize(new { result = res }); return MvcHtmlString.Create(rv); } } 


рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рд▓рд┐рдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдЕрдкрдиреЗ рдПрдорд╡реАрд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд╕рд▓реА рд▓рдбрд╝рдХреЗ HtmlHelper рд╡рд┐рд╕реНрддрд╛рд░рдХ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ:
 namespace MyControlLib { public static class HtmlExtensions { public static HtmlString InputEx(this HtmlHelper @this, Action<InputExControlSettings> setupFn) { var options = new InputExControlSettings(); //   setupFn(options); //  var view = new InputExControl(options); //   var tempWriter = new StringWriter(CultureInfo.InvariantCulture); //       Razor view.PushContext(new WebPageContext(), tempWriter); //   view.Execute(); //  View -     view.PopContext(); //   return MvcHtmlString.Create(tempWriter.GetStringBuilder().ToString()); //    View } } } 


рдареАрдХ рд╣реИ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рдХ рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдмрд╕ рдПрдХ рдЖрдВрд╢рд┐рдХ рджреГрд╢реНрдп MyInputCtrlPartial (рдФрд░ рдПрдХ рдПрдХреНрд╢рди рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдмрдирд╛рдПрдВ, рдЬрд╣рд╛рдВ рдХреБрдЫ рд▓рд┐рдЦреЗрдВ
 @using MyControlLib @Html.InputEx(s=> { s.Name = "MyInputCtrl"; s.CallbackRouteValues = new { Controller = "Home", Action = "MyInputCtrlPartial" }; s.ValidationRegexp = @"^\d+$"; }) 


рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ (рдореБрдЦреНрдп рджреГрд╢реНрдп рдореЗрдВ Html .Partial ("MyInputCtrlPartial") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

рд╣рдореЗрдВ PartialView рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ "рд░реЗрдВрдбрд░рд┐рдВрдЧ" рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧрд╛ - рдкреНрд░реЗрд╖рд┐рдд рд╣реЗрдбрд░ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд┐рд╕реЗ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЙрд▓рдмреИрдХ рд╣реИред

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

рдкрд░рд┐рдгрд╛рдо


рдиреАрдЪреЗ рдкрдВрдХреНрддрд┐: рд╣рдо рдПрдХ рдХрдард┐рди рдирд┐рдпрдВрддреНрд░рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ, рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░реЗрдЬрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╣рд┐рдд) рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЗрдВрдЯреЗрд▓реАрд╕реЗрдиреНрд╕ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ http://rghost.ru/42818685 ( рджрд░реНрдкрдг ) рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

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


All Articles