
рдкрд░рд┐рдЪрдп
рдирдорд╕реНрдХрд╛рд░ рд╕рд╛рдерд┐рдпреЛрдВ!
рдЖрдЬ рдореИрдВ рд░реЗрдЬрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ASP.NET рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рдореЙрдбрд▓ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдПрд╕рдкреА рдХреЗ рд╕рднреА рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ ред NET ( MVC 5 , рдХреЛрд░ , рдЖрджрд┐)ред рдпрд╣ рд▓реЗрдЦ рдЙрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд░рдЦрддреЗ рдереЗред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рд╣рдо рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрди рдЪреАрдЬреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ), рд╣рдо рд╕реАрдзреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдп
рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рдЖрддреНрдорд╕рд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд рдЙрд╕ рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╣рдиреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЕрдореВрд░реНрдд рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реЗрд╖ рдкрд╣рд▓реБрдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬрд╛рдирдмреВрдЭрдХрд░ рдпрд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрдп, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдЧреЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЧреБрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЕрдиреНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдШрдЯрдХреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореЙрдбрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░) рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдореЙрдбрд▓ рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВ (рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рдиреМрд╡рд╣рди рдЧреБрдг рдФрд░ рдЗрддрдиреЗ рдкрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):
class Transport { public int Id { get; set; } public int TransportTypeId { get; set; } public string Number { get; set; } }
рдмреЗрд╢рдХ, TransportTypeId рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рд╣реИ TransportType :
class TransportType { public int Id { get; set; } public string Name { get; set; } }
рдлреНрд░рдВрдЯрдПрдВрдб рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдо рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рддрджрдиреБрд╕рд╛рд░, рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдЯреАрдУ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
class TransportAddDTO { [Required] public int TransportTypeId { get; set; } [Required] [MaxLength(10)] public string Number { get; set; } }
* System.ComponentModel.DataAnnotations
рд╕реЗ рдорд╛рдирдХ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдХрд╛рд░ рдХреЗ рдРрдб рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рд╡реНрдпреВ рдореЙрдбрд▓ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЦрд╝реБрд╢реА рд╕реЗ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ TransportAddDTO рд╕реНрд╡рдпрдВ рдРрд╕рд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ "crammed" рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп рдПрдХ рдирдП рддрддреНрд╡ (рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмреИрдХрдПрдВрдб рдЬрд╛рдирдХрд╛рд░реА рдХреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрдб рдкреЗрдЬ рдкрд░ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╣рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ (рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ TransportTypeId рдХреЛ рдмрд╛рдж рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдирд┐рдореНрди рджреЗрдЦреЗрдВ рдореЙрдбрд▓ рд╕реНрд╡рдпрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ:
class TransportAddViewModel { public IEnumerable<TransportTypeDTO> TransportTypes { get; set; } }
рдЬрд╣рд╛рдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ TransportTypeDTO , TransportType рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реЛрдЧрд╛ (рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ - рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХрдЯрд╛рд╡ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ):
class TransportTypeDTO { public int Id { get; set; } public string Name { get; set; } }
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╡рд╛рдЬрд┐рдм рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рд░реЗрдЬрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдореЙрдбрд▓ (рдФрд░ рднрдЧрд╡рд╛рди рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛) рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ HTML рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TransportAddDTO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ! рдпрд╣ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рджреЗрдЦреЗрдВ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдпрд╣ рдбреАрдЯреАрдУ , рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
class TransportAddViewModel { public TransportAddDTO AddDTO { get; set; } public IEnumerable<TransportTypeDTO> TransportTypes { get; set; } }
рдЕрдм рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред рдЪрд▓реЛ рд╣рдорд╛рд░реА .cshtml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреГрд╖реНрда рдкрд░ "рд╡рд╛рд╣рди рд╕рдВрдЦреНрдпрд╛" рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдЗрд╕реЗ TransportAddView.cshtml рд╣реЛрдиреЗ рджреЗрдВ):
@model TransportAddViewModel @Html.TextBoxFor(m => m.AddDTO.Number)
рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ HTML рдХреЛрдб рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛:
<input id="AddDTO_Number" name="AddDTO.Number" />
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╡рд╛рд╣рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ ( рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдорд╡реАрд╕реА 5 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕рдорд╛рди рд╣реИ ):
[Route("add"), HttpPost] public ActionResult Add(TransportAddDTO transportAddDto) {
рдпрд╣рд╛рдБ рд╣рдо рдХрдо рд╕реЗ рдХрдо рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:
- Id рдФрд░ Name рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ AddDTO рдЙрдкрд╕рд░реНрдЧ рд╣реИ, рдФрд░, рдмрд╛рдж рдореЗрдВ, рдпрджрд┐ рдореЙрдбрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдкрд░рд┐рд╡рд╣рди рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЖрдП рдбреЗрдЯрд╛ рдХреЛ TransportAddDTO рдореЗрдВ рдмрд╛рдБрдзрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреА рд╣реИ, рддреЛ рдЕрдВрджрд░ рдХреА рд╡рд╕реНрддреБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╢реВрдиреНрдп (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди) рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдиреЗрдЧреА, рдпрд╛рдиреА рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдирдпрд╛ рдЦрд╛рд▓реА рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ред рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ - рдкреНрд░рдкрддреНрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдЗрдВрдбрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╛рдо, AddDTO_Number рдирд╣реАрдВред
- рд╕рднреА рдореЗрдЯрд╛ рдЧреБрдг рдЪрд▓реЗ рдЧрдП рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдбреЗрдЯрд╛-рд╡реИрд▓-рдЖрд╡рд╢реНрдпрдХ рдФрд░ рдЕрдиреНрдп рд╕рднреА рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ AddDTO рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд░реЗрдЬрд░ рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреГрд╢реНрдпрдкрдЯрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреБрдХрд╕рд╛рди рд╣реИред
рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрдгрдп рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпреЗ рдЪреАрдЬреЗрдВ "рдХрд╛рдо" рдХрд░рддреА рд╣реИрдВ, @Html.Kendo().TextBoxFor()
рдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ (рдпрд╛рдиреА @Html.Kendo().TextBoxFor()
, рдЖрджрд┐)ред
рдЪрд▓рд┐рдП рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ, рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдП рдЧрдП TransportAddDTO рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╢реВрдиреНрдп рдерд╛ред рдФрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рддрдВрддреНрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдРрд╕рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдХрдо рд╕реЗ рдХрдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИрдВред рдХреНрд░рдорд╢рдГ, рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдкрд╣рд▓реЗ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рд╕ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде TransportAddDTO рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬреЛ рдПрдХ рдЖрд░рдВрднрд┐рдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╡рд╣реА рдХрд░реЗрдЧрд╛:
class TransportAddViewModel { public TransportAddDTO AddDTO { get; set; } = new TransportAddDTO(); public IEnumerable<TransportTypeDTO> TransportTypes { get; set; } }
рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛:
<input data-val="true" id="AddDTO_Number" name="AddDTO.Number" data-val-required="The Number field is required." data-val-length="The field Number must be a string with a maximum length of 10." data-val-length-max="10" />
рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░! рдпрд╣ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ - рдЗрд╕рдХреЗ рд╕рд╛рде, рд╡реИрд╕реЗ, рд╕рдм рдХреБрдЫ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдЬрд╝рд░ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╡реЗрдмрд╡реНрдпреВрдкреЗрдЬ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдВрджрд░ .cshtml рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрдкрд▓рдмреНрдз рд╣реИ) рдПрдХ рдПрдЪрдЯреАрдПрдордПрд▓ рдЧреБрдг рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо TextBoxFor
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TextBoxFor
ред
рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рддреБрд░рдВрдд рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ HtmlHelper<T>
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, HtmlHelper<TransportAddViewModel>
ред рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ - рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ HtmlHelper рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ TransportAddDTO рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╕рдВрднрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд╛рддреЗ рд╣реИрдВ:
HtmlHelper<T>.HtmlHelper(ViewContext viewContext, IViewDataContainer viewDataContainer);
рд╣рдо рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдЕрдкрдиреЗ WebViewPage рдЙрджрд╛рд╣рд░рдг рд╕реЗ ViewContext рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдЖрдЗрдП рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ IVIVDataContainer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВ:
public class ViewDataContainer<T> : IViewDataContainer where T : class { public ViewDataDictionary ViewData { get; set; } public ViewDataContainer(object model) { ViewData = new ViewDataDictionary(model); } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рд╣рдо рд╡реНрдпреВрдбреЗрдЯрд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджрд┐рдП рдЧрдП рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдпрд╣ рд╡реНрдпреВ рдореЙрдбрд▓ рд╕реЗ рд╣рдорд╛рд░реЗ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯрдПрдбреАрдбреАрдЯреАрдУ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╣реА рд╣реИ, рдЖрдк рдЗрд╕ рддрд░рд╣ рдкреЛрд╖рд┐рдд рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
var vdc = new ViewDataContainer<TransportAddDTO>(Model.AddDTO);
рддрджрдиреБрд╕рд╛рд░, рдХреЛрдИ рдирдИ HtmlHelper рдмрдирд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ:
var Helper = new HtmlHelper<T>(this.ViewContext, vdc);
рдЕрдм рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@model TransportAddViewModel @{ var vdc = new ViewDataContainer<TransportAddDTO>(Model.AddDTO); var Helper = new HtmlHelper<T>(this.ViewContext, vdc); } @Helper.TextBoxFor(m => m.Number)
рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ HTML рдХреЛрдб рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛:
<input data-val="true" id="Number" name="Number" data-val-required="The Number field is required." data-val-length="The field Number must be a string with a maximum length of 10." data-val-length-max="10" />
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ "рдХрдВрдШреА" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рд░рд╣рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдХрдо рднрд╛рд░реА рди рджрд┐рдЦреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ ViewDataContainer рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ:
public class ViewDataContainer<T> : IViewDataContainer where T : class { public ViewDataDictionary ViewData { get; set; } public ViewDataContainer(object model) { ViewData = new ViewDataDictionary(model); } public HtmlHelper<T> GetHtmlHelper(ViewContext context) { return new HtmlHelper<T>(context, this); } }
рдлрд┐рд░ рд░реЗрдЬрд░ рд╕реЗ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@model TransportAddViewModel @{ var Helper = new ViewDataContainer<TransportAddDTO>(Model.AddDTO).GetHtmlHelper(ViewContext); } @Helper.TextBoxFor(m => m.Number)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рднреА WebViewPage рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрддреНрддрд┐ (рдбреАрдЯреАрдУ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯрд░ рдХреЗ рд╕рд╛рде) рд╢рд╛рдорд┐рд▓ рд╣реЛред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ, рдФрд░ рд░реЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпреВ рдореЙрдбрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рднреА рдорд┐рд▓рд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрднрд╡рддрдГ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА ViewDataContainer рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдпрд╣ рд╣рдорд╛рд░реА .cshtml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдмрдЯрди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдмреИрдХрдПрдВрдб рдкрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реБрдП)ред рдпрд╣ рдореИрдВ рдЕрдкрдиреЗ рджрдо рдкрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдпрджрд┐ рдПрдХ рд╕рдореНрдорд╛рдирд┐рдд рдкрд╛рдардХ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рдд рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рддрд░реАрдХреЛрдВ рд╕реЗ, рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЦреБрд╢реА рд╕реЗ рд╕реБрдиреВрдВрдЧрд╛ред
рдирд┐рд╖реНрдард╛ рд╕реЗ,
рдкреАрдЯрд░ рдУрд╕рдмреНрд░рд┐рдЬ