рдХрд┐рд╕реА рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЗрди рдбреЗрдЯрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╕реНрддреБрддрд┐ рднреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо ASP.net MVC рдореЗрдВ рдЗрдВрдЯрд░-рдЯреЗрдмрд▓ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдШрдЯрдХ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдПрдХ рддрд░рдл рдпрд╣ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░реА рддрд░рдл рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреА рдЦреЛрдЬ, рдЫрдБрдЯрд╛рдИ рдФрд░ рдЪрдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JqGrid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзреЗрдп рдХреЗ рдЧрдарди рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВрдЧреЗ, рджреЗрдЦреЗрдВ рдХрд┐ рдореЗрдЯрд╛рдбрд╛рдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ HTML рд╕рд╣рд╛рдпрдХ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдореМрдЬреВрджрд╛ рдШрдЯрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдардХ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдЯреЗрдмрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдбреНрд░реЙрдкрдбрд╛рдЙрдирд▓рд┐рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрдЯрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдкрд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдереАрдВ, рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реВрдЪреА рдХреЗ рд╕рд╛рде, рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдФрд░ рдЦреЛрдЬрдирд╛, рдФрд░ рдЪреВрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рджреЛ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдФрд░ "рд╕рдореВрд╣"
public class UserProfile { [Key] public int UserId { get; set; } public string UserName { get; set; } public int? UserGroupId { get; set; } public virtual UserGroup UserGroup { get; set; } } public class UserGroup { [Key] public int UserGroupId { get; set; } [DisplayName("Group Name")] public string GroupName { get; set; } [DisplayName("Group Description")] public string Description { get; set; } public virtual ICollection<UserProfile> Users { get; set; } }
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдореВрд╣ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА Nth рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдореВрд╣ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдПрдХ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╕рд╛рде рд╣реА рдЗрд╕рдХреА рдХрд▓реНрдкрдирд╛ рднреА рдХрд░реЗрдЧрд╛ред рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
public ActionResult Index() { var userProfiles = _db.UserProfiles.Include(c => c.UserGroup); return View(userProfiles.ToList()); }
рджрд░рдЕрд╕рд▓, рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдбреЗрдЯрд╛, рдЗрд╕ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЬреБрдбрд╝реЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, DisplayNameFor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╡реНрдпреВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
@Html.DisplayNameFor(model => model.UserGroup.GroupName)
рдпрджрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдЖрдк рдбреНрд░реЙрдкрдбрд╛рдЙрдирд▓рд┐рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдКрдкрд░ рджреА рдЧрдИ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдПред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рд╣реИ рдПрдЪрдЯреАрдПрдордПрд▓ рд╣реЗрд▓реНрдкрд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕, рдЬреЛ рд╣рдореЗрдВ рджреГрд╢реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
1. рд▓реБрдХрдЕрдк рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓ рд╣реЗрд▓реНрдкрд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕
ASP.net MVC рдореЗрдВ Html рд╣реЗрд▓реНрдкрд░ рдХреНрдпрд╛ рд╣реИ? рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдпреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ HTML рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдХрдХреНрд╖рд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирдХ рд▓реБрдХрдЕрдк рдирд┐рдпрдВрддреНрд░рдг рджреГрд╢реНрдп, рдЕрд░реНрдерд╛рддреН рдПрдХ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдИрдбреА рд░рд┐рдХреЙрд░реНрдб рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
Html рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛, html рд╕рд╣рд╛рдпрдХ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдореЙрдбрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рддреЛ рдиреАрдЪреЗ рд▓реБрдХрдЕрдк рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХреЛрдб рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public sealed class LookupAttribute : Attribute { public Type Model { get; set; } public string NameField { get; set; } }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдкрд╛рда рд╡рд┐рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореЙрдбрд▓ рд╣рдо рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдВрдЧреЗред рддреЛ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХрд╛ рдХреЛрдб рдереЛрдбрд╝рд╛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
public class UserProfile { [Key] public int UserId { get; set; } public string UserName { get; set; } [Lookup(Model = typeof(UserGroup), NameField = "GroupName")] public int? UserGroupId { get; set; } public virtual UserGroup UserGroup { get; set; } }
рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдореЙрдбрд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ GroupName рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рдорд╛рд░реЗ HTML рд╣реЗрд▓реНрдкрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕реЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ DataAnnotationsModelMetadataProvider рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
public class LookupMetadataExtension : DataAnnotationsModelMetadataProvider { protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) { var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); var additionalValues = attributes.OfType<LookupAttribute>().FirstOrDefault(); if (additionalValues != null) { metadata.AdditionalValues.Add(LookupConsts.LookupMetadata, additionalValues); } return metadata; } }
рдлрд╝реАрд▓реНрдб рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ DataAnnotationsModelMetadataProvider рд╡рд░реНрдЧ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ CreateMetadata рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред DataAnnotationsModelMetadataProvider рд╡рд░реНрдЧ ASP.NET MVC рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдпрджрд┐ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╕реНрдерд╛рди рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Global.asax.cs рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:
ModelMetadataProviders.Current = new LookupMetadataExtension();
рдЕрдм рд╣рдо рдЕрдкрдиреЗ HTML рд╕рд╣рд╛рдпрдХ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, HTML рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛
public static MvcHtmlString LookupFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string filterAction, Type modelType, String nameField, IDictionary<string, object> htmlAttributes) { var fieldName = ExpressionHelper.GetExpressionText(expression); var commonMetadata = PrepareLookupCommonMetadata( ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData), htmlHelper.ViewData.ModelMetadata, modelType, nameField); var lookupAttribute = commonMetadata.AdditionalValues[LookupConsts.LookupMetadata] as LookupAttribute; return LookupHtmlInternal(htmlHelper, commonMetadata, lookupAttribute, fieldName, filterAction, htmlAttributes); }
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реАрдзреЗ рджреГрд╢реНрдп рд╕реЗ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рддреИрдпрд╛рд░рд▓реБрдХрдЕрдкрдХреЛрдореЛрдирдореЗрдЯреЗрдЯрд╛рдЯрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдмрд╛рдж рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд╛рдЗрди ModelMetadata.FromLambdaExpression (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, htmlHelper.ViewData) рд╡рд░реНрддрдорд╛рди рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрддред рдЗрд╕рдХреЗ рдмрд╛рдж, рд▓реМрдЯреА рд╣реБрдИ рдХреЙрдордирдореЗрдЯрдЯрд╛рдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ, рд╣рдо рдЕрдкрдирд╛ рд▓реБрдХрдЕрдкрдЖрд░реНрдЯреНрд░реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ HTML рдХреЛрдб рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдЪрд▓рд┐рдП ReadyLookupCommonMetadata рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред
private static ModelMetadata PrepareLookupCommonMetadata(ModelMetadata fieldMetadata, ModelMetadata modelMetadata , Type modelType, String nameField) { LookupAttribute lookupMetadata; if (modelType != null && nameField != null) { lookupMetadata = new LookupAttribute { Model = modelType, NameField = nameField }; if (fieldMetadata.AdditionalValues.ContainsKey(LookupConsts.LookupMetadata)) fieldMetadata.AdditionalValues.Remove(LookupConsts.LookupMetadata); fieldMetadata.AdditionalValues.Add(LookupConsts.LookupMetadata, lookupMetadata); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдореЙрдбрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЕрддрд┐рд░рд┐рдХреНрддрд╡реИрд▓реНрдпреВрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ
if (fieldMetadata.AdditionalValues != null && fieldMetadata.AdditionalValues.ContainsKey(LookupConsts.LookupMetadata)) { lookupMetadata = fieldMetadata.AdditionalValues[LookupConsts.LookupMetadata] as LookupAttribute; if (lookupMetadata != null) { var prop = lookupMetadata.Model.GetPropertyWithAttribute("KeyAttribute"); var releatedTableKey = prop != null ? prop.Name : String.Format("{0}Id", lookupMetadata.Model.Name); fieldMetadata.AdditionalValues.Add("idField", releatedTableKey); var releatedTableMetadata = modelMetadata.Properties.FirstOrDefault(proper => proper.PropertyName == lookupMetadata.Model.Name); if (releatedTableMetadata != null) { UpdateLookupColumnsInfo(releatedTableMetadata, fieldMetadata); UpdateNameFieldInfo(lookupMetadata.NameField, releatedTableMetadata, fieldMetadata); } else { throw new ModelValidationException(String.Format( "Couldn't find data from releated table. Lookup failed for model {0}", lookupMetadata.Model.Name)); } } } else { throw new ModelValidationException(String.Format("Couldn't find releated model type. Lookup field")); } return fieldMetadata; }
рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрддрд╡реИрд▓реНрдпреВрдЬрд╝ рдХреЗ рдкрд╛рд╕ рдЬрдЧрд╣ рд╣реИ, рдлрд┐рд░ рдЙрд╕реЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЕрдЧрд▓рд╛, GetPropertyWithAttribute рдкреНрд░рдХрд╛рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓ рд╕реЗ рдХреБрдВрдЬреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдлрд╝реАрд▓реНрдб рд▓рд┐рдВрдХреНрдб рдЯреЗрдмрд▓ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреБрдж рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ- рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо + рдЖрдИрдбреА = рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреАред рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдорд╛рди рдХреЛ idField рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреЙрд▓рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкрд╛рда рдкрд░рд┐рднрд╛рд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдХреЙрд▓рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЦреЗрддреЛрдВ рдХреА рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ JqGrid рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдПрдВред
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class LookupGridColumnsAttribute : Attribute { public string[] LookupColumns { get; set; } public LookupGridColumnsAttribute(params string[] values) { LookupColumns = values; } }
рдЕрдм рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рджреГрд╢реНрдп рдХреЛ рджреЗрдЦреЗрдВред рд▓реБрдХрдЕрдкрдЧреНрд░рд┐рдбрдХреЛрд▓реНрдпреВрдореЗрдВрдЯреНрд╕ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реБрдХрдЕрдк рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рд╣реИред
[LookupGridColumns(new[] { "Description" })] public class UserGroup { [Key] public int UserGroupId { get; set; } [DisplayName("Group Name")] public string GroupName { get; set; } [DisplayName("Group Description")] public string Description { get; set; } public virtual ICollection<UserProfile> Users { get; set; } }
рдХреЙрд▓рдо рд╕реВрдЪреА рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдореВрд╣рдирд╛рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдХреЙрд▓рдо рджреНрд╡рд╛рд░рд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред
private static void UpdateLookupColumnsInfo(ModelMetadata releatedTableMetadata, ModelMetadata metadata) { IDictionary<string, string> columns = new Dictionary<string, string>(); var gridColumns = releatedTableMetadata.ModelType.GetCustomAttributeByType<LookupGridColumnsAttribute>(); if (gridColumns != null) { foreach (var column in gridColumns.LookupColumns) { var metadataField = releatedTableMetadata.Properties.FirstOrDefault( propt => propt.PropertyName == column); if (metadataField != null) { columns.Add(column, metadataField.DisplayName); } else { throw new ModelValidationException( String.Format("Couldn't find column in releated table {0}", releatedTableMetadata.GetDisplayName())); } } metadata.AdditionalValues.Add("lookupColumns", columns); } }
рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ, рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ LookupGridColumnsAttribute рд╡рд┐рд╢реЗрд╖рддрд╛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдбрд┐рд╕реНрдкреНрд▓реЗрдиреЗрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛред рдпрджрд┐ рдХреЛрдИ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХреЗрдВ; рдЕрдиреНрдпрдерд╛, рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдХреЙрд▓рдо рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдЯрд╛рд╡рд┐рд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝реАрд▓реНрдб рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рд╡реЗ рдЖрдЧреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред
рддреЛ рдЕрдм рд╣рдорд╛рд░реЗ рддреИрдпрд╛рд░реАрд▓реБрдХрдЕрдкрдореЛрдирдореЗрдЯрдбреЗрдЯрд╛рдЯрд╛ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓реМрдЯрдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рдХреЙрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЕрд░реНрдерд╛рддреН UpdateNameFieldInfoред
private static void UpdateNameFieldInfo(string nameField, ModelMetadata releatedTableMetadata, ModelMetadata commonMetadata) { var nameFieldMetedata = releatedTableMetadata.Properties.FirstOrDefault(propt => propt.PropertyName == nameField); if (nameFieldMetedata != null) { commonMetadata.AdditionalValues.Add("lookupFieldValue", nameFieldMetedata.SimpleDisplayText); commonMetadata.AdditionalValues.Add("lookupFieldDisplayValue", nameFieldMetedata.DisplayName); } else { throw new ModelValidationException(String.Format("Couldn't find name field in releated table {0}", releatedTableMetadata.GetDisplayName())); } }
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╡рд╣реА рдлрд╝реАрд▓реНрдб рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд▓реБрдХрдЕрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ "NameField =" GroupName "рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдорд╛рд░реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрддValues тАЛтАЛрдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред nameFieldMetedata.SimpleDisplayText - рд▓рд┐рдВрдХреНрдб рдЯреЗрдмрд▓ рд╕реЗ GroupName рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рдиред nameFieldMetedata.DisplayName - рд▓рд┐рдВрдХ рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ GroupName рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдоред
рдпрд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреБрдХреНрдд рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реБрдХрдЕрдкрдПрдЪрдЯреАрдПрдордПрд▓рдЗрдВрдЯрд░рдирд▓ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЙрд▓ рд▓реБрдХрдЕрдк рдлрдВрдХреНрд╢рди рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдЪрдЯреАрдПрдордПрд▓ рд╣реЗрд▓реНрдкрд░ рд╕реЗрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
private static MvcHtmlString LookupHtmlInternal(HtmlHelper htmlHelper, ModelMetadata metadata, LookupAttribute lookupMetadata, string name, string action, IDictionary<string, object> htmlAttributes) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("Error", "htmlHelper"); } var divBuilder = new TagBuilder("div"); divBuilder.MergeAttribute("id", String.Format("{0}_{1}", name, "div")); divBuilder.MergeAttribute("class", "form-wrapper cf"); divBuilder.MergeAttribute("type", lookupMetadata.Model.FullName); divBuilder.MergeAttribute("nameField", lookupMetadata.NameField); divBuilder.MergeAttribute("idField", metadata.AdditionalValues["idField"] as string); divBuilder.MergeAttribute("nameFieldDisplay", metadata.AdditionalValues["lookupFieldDisplayValue"] as string); divBuilder.MergeAttribute("action", action);
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред 1. htmlHelper - рд╣рдореЗрдВ html рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, 2. рдореЗрдЯрд╛рдбреЗрдЯрд╛ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рднреА ext рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдХрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реИред рдореЗрдЯрд╛рдбрд╛рдЯрд╛ рд╕реВрдЪрдирд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред 3. рд╕рдорд░реНрдкрд┐рдд рд▓реБрдХрдореИрдЯрдбреЗрдЯрд╛ рдЕрд▓рдЧ рд╕реЗред 4. рдирд╛рдо - рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдирд╛рдо, рдЬреИрд╕рд╛ рдХрд┐ рджреГрд╢реНрдп рдореЗрдВ рд╣реИред 5 рдХрд╛рд░реНрд░рд╡рд╛рдИ - рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рд╡рд┐рдзрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред 5 htmlAttributes - extред HTML рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореБрдЦреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ div рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдо рдореБрдЦреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ: рдкреНрд░рдХрд╛рд░ - рдЬрд┐рд╕ рдореЙрдбрд▓ рдХрд╛ рд╣рдо рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, nameField - рд▓рд┐рдВрдХреНрдб рдЯреЗрдмрд▓ рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо рдЬреЛ рд░рд┐рд╢реНрддреЗ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдореВрд╣ рдХрд╛ рдирд╛рдо), idField - рд▓рд┐рдВрдХреНрдб рдЯреЗрдмрд▓ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА, nameFieldDisplay - рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкрд╛рда рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рдиред рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ - рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
var columnsDivBuilder = new TagBuilder("div"); columnsDivBuilder.MergeAttribute("id", String.Format("{0}_{1}", name, "columns")); columnsDivBuilder.MergeAttribute("style", "display:none"); if (metadata.AdditionalValues.ContainsKey("lookupColumns")) { var columns = ((IDictionary<string, string>)metadata.AdditionalValues["lookupColumns"]); var columnString = String.Empty; foreach (var column in columns.Keys) { var columnDiv = new TagBuilder("div"); columnDiv.MergeAttribute("colName", column); columnDiv.MergeAttribute("displayName", columns[column]); columnString += columnDiv.ToString(TagRenderMode.SelfClosing); } columnsDivBuilder.InnerHtml = columnString; }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕реА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдПрдХ рдЯреЗрдмрд▓ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдЯреЗрдмрд▓ рд╕реЗ рд╕рднреА рдХреЙрд▓рдо рд╣реИрдВ рдЬреЛ рдХрд┐ JGGrid рдХреЗ рд▓рд┐рдП рд╡реНрдпреВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
var inputBuilder = new TagBuilder("input"); inputBuilder.MergeAttributes(htmlAttributes); inputBuilder.MergeAttribute("type", "text"); inputBuilder.MergeAttribute("class", "lookup", true); inputBuilder.MergeAttribute("id", String.Format("{0}_{1}", name, "lookup"), true); inputBuilder.MergeAttribute("value", metadata.AdditionalValues["lookupFieldValue"] as string, true); var hiddenInputBuilder = new TagBuilder("input"); hiddenInputBuilder.MergeAttribute("type", "hidden"); hiddenInputBuilder.MergeAttribute("name", name, true); hiddenInputBuilder.MergeAttribute("id", name, true); hiddenInputBuilder.MergeAttribute("value", metadata.SimpleDisplayText, true); var buttonBuilder = new TagBuilder("input"); buttonBuilder.MergeAttribute("type", "button"); buttonBuilder.MergeAttribute("value", "Lookup"); buttonBuilder.MergeAttribute("class", "lookupbutton"); buttonBuilder.MergeAttribute("id", String.Format("{0}_{1}", name, "lookupbtn"), true);
рд╣рдо рдмрд╛рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рд╣рдорд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди (рдиреЗрдордлрд┐рд▓реНрдб) рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░, рд╣рдорд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рдЖрдИрдбреА рд╡рд╛рд▓реЗ рдЫрд┐рдкреЗ рд╣реБрдП рдХреНрд╖реЗрддреНрд░, рдЬрд┐рд╕ рдмрдЯрди рдкрд░ рд╣рдо рд▓рд┐рдВрдХ рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде JqGrid рдЦреЛрд▓реЗрдВрдЧреЗред
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрдпрдирд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреА рдЖрдИрдбреА рдорд┐рд▓ рдЬрд╛рддреА рд╣реИ редimpleDisplayTextред
divBuilder.InnerHtml = String.Format(@"{0}{1}{2}{3}", inputBuilder.ToString(TagRenderMode.SelfClosing), hiddenInputBuilder.ToString(TagRenderMode.SelfClosing), buttonBuilder.ToString(TagRenderMode.SelfClosing), columnsDivBuilder.ToString(TagRenderMode.Normal) ); return new MvcHtmlString(divBuilder.ToString(TagRenderMode.Normal)); }
рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рд░реВрдЯ div рдореЗрдВ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ html рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ HTML рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдерд╛, рд╣рдо рд▓реБрдХрдЕрдк рд╡рд┐рдзрд┐ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
public static MvcHtmlString LookupFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); return LookupFor(htmlHelper, expression, urlHelper.Action("LookupData"), null, null, null); } public static MvcHtmlString LookupFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string filterAction) { return LookupFor(htmlHelper, expression, filterAction, null, null, null); }
рд╣рдорд╛рд░реЗ html рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ Html.LookupFor (model => model.UserGroupId) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рджреГрд╢реНрдп рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдореБрдЦреА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рдПрдЪрдЯреАрдПрдордПрд▓ рд╣реЗрд▓реНрдкрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд░реНрдЧ web.config рдореЗрдВ system.web -> рдкреГрд╖реНрдареЛрдВ -> рдирд╛рдорд╕реНрдерд╛рди рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдпрд╛ рдмрд╕ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд░рдЦреЗрдВред System.Web.Helpers рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╛, рд╕реАрдзреЗ рджреГрд╢реНрдп рдореЗрдВ, <@use your.namespace> рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
рдпрд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ HtmlHelper рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдо рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреА рдУрд░ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред
2. рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзреЗрдп рдХрд╛ рдЧрдардиред
рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдореЛрдб рдореЗрдВ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╣рдореЗрдВ рдЙрди рд╡рд┐рдзреЗрдпрдХреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдПрдХ рдХреНрд╡реЗрд░реА рдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред LinqExtension рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЕрдВрддрддрдГ рдЧрддрд┐рд╢реАрд▓ Linq рдХреЗ рдЧрдарди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреА рд╣реИрдВред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗред
public static IQueryable<T> Where<T>(this IQueryable<T> source, string fieldName, string searchString, string compareFunction) { if (searchString == null) searchString = String.Empty; var param = Expression.Parameter(typeof(T)); var prop = Expression.Property(param, fieldName); var methodcall = Expression.Call(prop, typeof(String).GetMethod(compareFunction, new[] { typeof(string) }), Expression.Constant(value: searchString)); var lambda = Expression.Lambda<Func<T, bool>>(methodcall, param); var request = source.Where(lambda); return request; }
рддреЛ рдлрд╝реАрд▓реНрдбрдирд╛рдо рд╡рд╣ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рд╣реИ, рдЬрд╣рд╛рдБ рд╕реЗ рд╣рдо рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗ, searchString рд╡рд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд░реНрдЧ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХрд┐ рддреБрд▓рдирд╛ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдЧреЗ, рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреА рдЧрдИ рдереА, рд╡рд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╕рдм рдареАрдХ рд╣реИ, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рд╡реНрдпрд╛рд╕ (рдЯрд╛рдЗрдкреЛрдлрд╝ (рдЯреА)); рдЬрд┐рд╕ рдкрд░ рд╣рдо рдореБрдбрд╝реЗрдВрдЧреЗ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЙрдбрд▓ рд╕реЗ рдлрд╝реАрд▓реНрдб, рдкреНрд░рдХрд╛рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рд╣рдо рдЦреЛрдЬ рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реНрдХреЛрдВ рдФрд░ "рдЧреБрдг рд╕реВрдЪрдХ" рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рд╕реЗ рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ IQueryable рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬрд╣рд╛рдВ рдпрд╣ рдирдП рдмрдирд╛рдП рдЧрдП рд╡рд┐рдзреЗрдп рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХреЗред рдЙрддреНрдкрдиреНрди IQueryable рд▓реМрдЯреЗрдВред
рд╣рдо рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрдИ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
public static IQueryable<T> WhereStartsWith<T>(this IQueryable<T> source, string fieldName, string searchString) { return Where(source, fieldName, searchString, "StartsWith"); } public static IQueryable<T> WhereContains<T>(this IQueryable<T> source, string fieldName, string searchString) { return Where(source, fieldName, searchString, "Contains"); }
рдЫрд╡рд┐ рдФрд░ рд╕рдорд╛рдирддрд╛ рдореЗрдВ, рд╣рдо рд╕рдорд╛рди рдФрд░ NotEqual рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
public static IQueryable<T> Equal<T>(this IQueryable<T> source, string fieldName, string searchString) { if (searchString == null) searchString = String.Empty; var param = Expression.Parameter(typeof(T)); var prop = Expression.Property(param, fieldName); var methodcall = Expression.Equal(prop, Expression.Constant(searchString)); var lambda = Expression.Lambda<Func<T, bool>>(methodcall, param); var request = source.Where(lambda); return request; } public static IQueryable<T> NotEqual<T>(this IQueryable<T> source, string fieldName, string searchString) { if (searchString == null) searchString = String.Empty; var param = Expression.Parameter(typeof(T)); var prop = Expression.Property(param, fieldName); var methodcall = Expression.NotEqual(prop, Expression.Constant(searchString)); var lambda = Expression.Lambda<Func<T, bool>>(methodcall, param); var request = source.Where(lambda); return request; }
рдпрд╣рд╛рдБ, рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рд░рд╣реВрдБрдЧрд╛ред
рд╣рдореЗрдВ рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо ApplyOrder рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName) { var type = typeof(T); var param = Expression.Parameter(type); var pr = type.GetProperty(prop); var expr = Expression.Property(param, type.GetProperty(prop)); var ptype = pr.PropertyType; var delegateType = typeof(Func<,>).MakeGenericType(type, ptype); var lambda = Expression.Lambda(delegateType, expr, param); var result = typeof(Queryable).GetMethods().Single( method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetGenericArguments().Length == 2 && method.GetParameters().Length == 2) .MakeGenericMethod(type, ptype) .Invoke(null, new object[] { source, lambda }); return (IOrderedQueryable<T>)result; }
рддрд░реНрдХреЛрдВ рджреНрд╡рд╛рд░рд╛: 1. рд╕рдВрдкрддреНрддрд┐ - рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рд╕реЙрд░реНрдЯ рдХрд░реЗрдВрдЧреЗ; 2.рдореЗрдереЛрдбрдиреЗрдо - рд╡рд╣ рд╡рд┐рдзрд┐ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдЕрдЧрд▓рд╛, рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред MakeGenericType рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдлрдВрдб <Tc, string> рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рдореЗрдердбрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдм рд╣рдо Queryable рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫрд╛рдВрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, bool desc , string property) { return ApplyOrder(source, property, desc ? "OrderByDescending" : "OrderBy"); } public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property) { return ApplyOrder(source, property, "OrderBy"); } public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property) { return ApplyOrder(source, property, "OrderByDescending"); } public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property) { return ApplyOrder(source, property, "ThenBy"); } public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property) { return ApplyOrder(source, property, "ThenByDescending"); }
рдпрд╣ рд▓рд╛рдЗрдирдХ рд╣реЗрд▓реНрдкрд░ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред
3. рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ ModelBinder рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдРрд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЖрд╕рд╛рди рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо jqgrid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЫрдВрдЯрд╛рдИ, рдЦреЛрдЬ, рдкреГрд╖реНрдард╛рдВрдХрди рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЙрдбрд▓ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ: public enum SearchOperator { Equal, NotEqual, Contains } public class FilterSettings { public string SearchString; public string SearchField; public SearchOperator Operator; } public class GridSettings { public bool IsSearch { get; set; } public int PageSize { get; set; } public int PageIndex { get; set; } public string SortColumn { get; set; } public bool Asc { get; set; } } public class LookupSettings { public Type Model { get; set; } public FilterSettings Filter { get; set; } public GridSettings GridSettings { get; set; } public string IdField { get; set; } public string NameField { get; set; } }
рдореИрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ jqGrid рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдпрд╛ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрдЧрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд▓реБрдХрдЕрдк рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред public class LookupModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { HttpRequestBase request = controllerContext.HttpContext.Request; var lookupSettings = new LookupSettings { Model = Type.GetType(request["modelType"]), IdField = request["IdField"], NameField = request["NameField"], Filter = new FilterSettings { SearchString = request["searchString"] ?? String.Empty, SearchField = request["searchField"] } }; if(request["searchOper"] != null) { switch (request["searchOper"]) { case "eq": lookupSettings.Filter.Operator = SearchOperator.Equal; break; case "ne": lookupSettings.Filter.Operator = SearchOperator.NotEqual; break; case "cn": lookupSettings.Filter.Operator = SearchOperator.Contains; break; } } lookupSettings.GridSettings = new GridSettings {Asc = request["sord"] == "asc"}; if (request["_search"] != null) lookupSettings.GridSettings.IsSearch = Convert.ToBoolean(request["_search"]); if (request["page"] != null) lookupSettings.GridSettings.PageIndex = Convert.ToInt32(request["page"]); if (request["rows"] != null) lookupSettings.GridSettings.PageSize = Convert.ToInt32(request["rows"]); lookupSettings.GridSettings.SortColumn = request["sidx"]; if (lookupSettings.Filter.SearchField == null) { lookupSettings.Filter.SearchField = request["NameField"]; lookupSettings.Filter.Operator = SearchOperator.Contains; } return lookupSettings; } }
рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ IModelBinder рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ BindModel рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╡рд╣ рд╕рдВрджрд░реНрдн рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╕рдВрджрд░реНрдн рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ, HTTP рд╕рд╛рдордЧреНрд░реА, рдЕрдиреБрд░реЛрдз рд╕рдВрджрд░реНрдн рдФрд░ рдорд╛рд░реНрдЧ рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдмрд╛рдЗрдВрдбрд┐рдВрдЧрдЯреЗрдХреНрд╕реНрдЯ - рд╡рд╣ рд╕рдВрджрд░реНрдн рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рдмрд╛рдзреНрдп рд╣реИред рд╕рдВрджрд░реНрдн рдореЗрдВ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ, рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо, рдореЙрдбрд▓ рдкреНрд░рдХрд╛рд░, рд╕рдВрдкрддреНрддрд┐ рдлрд╝рд┐рд▓реНрдЯрд░, рдФрд░ рдореВрд▓реНрдп рдкреНрд░рджрд╛рддрд╛ рдЬреИрд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рд╣рдо HttpRequestBase рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдореЗрдВ рджрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рд╕реЗрдЯрд┐рдВрдЧ рдореЙрдбрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдЧ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП Global.asax.cs рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВред ModelBinders.Binders.Add(typeof(LookupSettings), new LookupModelBinder());
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рднреА рдкрдВрдЬреАрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ Global.asax.cs рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: protected void Application_Start() { AreaRegistration.RegisterAllAreas(); ModelMetadataProviders.Current = new LookupMetadataExtension(); ModelBinders.Binders.Add(typeof(LookupSettings), new LookupModelBinder()); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); }
рдЕрдм рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рд╣рдо рд▓реБрдХрдЕрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред public virtual ActionResult LookupData([ModelBinder(typeof(LookupModelBinder))] LookupSettings settings)
рдЗрд╕ рдкрд░ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ:4. рд▓реБрдХрдЕрдк рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп MVC рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдпрд╛ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдШрдЯрдХ рд╕реЗ рдЖрдП рдШрдЯрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдореЛрдб рдореЗрдВ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪред рдЪрд▓рд┐рдП рд▓реБрдХрдЕрдкрдбреЗрдЯрд╛рдУрд╡рд░реЛрд▓реНрд╡рд░ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрдЧ рдЦреЛрдЬ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛, "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдореЛрдб рдореЗрдВ рдЫрдВрдЯрдиреАред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреНрд░рд┐рдб рд╕реЗ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдореЗрдВ рджрд░реНрдЬ рдкрд╛рда рдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рддрддреНрд╡ рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрдЪреВрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдЧрд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд░реВрдк рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб dbContext.Set () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред AsQueryable (); рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЕрдиреБрд░реЛрдз рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПредрд▓реБрдХрдЕрдкрдореЗрдереЛрдбрдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред private static ActionResult LookupMethodCall(string methodName, LookupSettings settings, DbContext dbContext, OnAfterQueryPrepared onAfterQueryPrepared) { var methodLookupCall = typeof(LookupDataResolver). GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Static); methodLookupCall = methodLookupCall.MakeGenericMethod(settings.Model); var lookupSettings = Expression.Parameter(typeof(LookupSettings), "settings"); var dbCtx = Expression.Parameter(typeof(DbContext), "dbContext"); var funct = Expression.Parameter(typeof(OnAfterQueryPrepared), "onAfterQueryPrepared"); var lookupSearch = Expression.Lambda( Expression.Call( null, methodLookupCall, lookupSettings, dbCtx, funct), lookupSettings, dbCtx, funct); var lookupSearchDelegate = (Func<LookupSettings, DbContext, OnAfterQueryPrepared, JsonResult>) lookupSearch.Compile(); return lookupSearchDelegate(settings, dbContext, onAfterQueryPrepared); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдореЗрдердбрдирд╛рдо рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, MakeGenericMethod рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ: рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рд▓реБрдХрдЕрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╕рд╛рд░), dbContext (рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн), onAfterQueryPrepared (рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдЕрдиреБрд░реЛрдз рдХреЗ рдЧрдарди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ)ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рдВрдмрдВрдзрд┐рдд рд▓реИрдореНрдмрдбрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВредрд╣рдо рд▓реБрдХрдЕрдкрдореЗрдердХреЙрдбрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд░реВрдк рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред BasicLookup, рд▓реБрдХрдЕрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рд▓реБрдХрдЕрдк рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред BasicGrid рдЧреНрд░рд┐рдб рдореЗрдВ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдЦреЛрдЬ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди LookupDataForGrid рдХрд╣рддреЗ рд╣реИрдВред public static ActionResult BasicLookup(LookupSettings settings, DbContext dbContext, OnAfterQueryPrepared onAfterQueryPrepared) { return LookupMethodCall("LookupSearch", settings, dbContext, onAfterQueryPrepared); } public static ActionResult BasicGrid(LookupSettings settings, DbContext dbContext, OnAfterQueryPrepared onAfterQueryPrepared) { return LookupMethodCall("LookupDataForGrid", settings, dbContext, onAfterQueryPrepared); }
рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рдпреЗ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХреЗ рдХреЙрд▓ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред private static JsonResult LookupSearch<T>(LookupSettings settings, DbContext dbContext, OnAfterQueryPrepared onAfterQueryPrepared) where T : class { var modelType = typeof(T); var request = dbContext.Set<T>().AsQueryable(); if (onAfterQueryPrepared != null) { var query = onAfterQueryPrepared(request, settings); if (query != null) request = query.Cast<T>(); } request = request.WhereStartsWith(settings.Filter.SearchField, settings.Filter.SearchString); return new JsonResult { Data = request.ToList().Select(t => new { label = modelType.GetProperty(settings.NameField).GetValue(t).ToString(), id = modelType.GetProperty(settings.IdField).GetValue(t).ToString() }).ToList(), ContentType = null, ContentEncoding = null, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; }
рддреЛ, рд╣рдо рдЗрд╕реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП dbContext рд╕реЗ рдПрдХ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреНрд╡реЗрд░реА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рджреЗрдЦреЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЖрдЧреЗ рджрд┐рдП рдЧрдП рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдпрд░рд╕реНрдЯрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рд┐рд▓реНрдЯрд░ред рд╕рд░реНрдЪрдлрд┐рд▓реНрдб, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред рдлреАрд▓реНрдб рдХреА рд▓рд╛рдЗрди рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╢рдГ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдлрд╝реАрд▓рд░ред рд╕рд░реНрдЪ рд╕реНрдЯреНрд░реАрдВрдЧ рдЗрдХрд╛рдИред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдореЙрдбрд▓ рдореЙрдбрд▓ рдЯрд╛рдЗрдк рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЯреА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВредрд╣рдо рдХреЗрд╡рд▓ рджреЛ рдХреЙрд▓рдо рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ: рд▓реЗрдмрд▓ - рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдФрд░ рдЖрдИрдбреА - рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡редрдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рд╣реЛрдВрдЧреЗ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдкрд╛рда рдЧреНрд░реЗ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рджреГрд╢реНрдп рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдЕрдЧрд▓рд╛, рд╣рдо рд▓реБрдХрдЕрдкрдбреЗрдЯрд╛рдЧреНрд░рд┐рдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЦреЛрдЬ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред private static JsonResult LookupDataForGrid<T>(LookupSettings settings, DbContext dbContext, OnAfterQueryPrepared onAfterQueryPrepared) where T : class { var modelType = typeof(T); var pageIndex = settings.GridSettings.PageIndex - 1; var pageSize = settings.GridSettings.PageSize; var request = dbContext.Set<T>().AsQueryable(); if (onAfterQueryPrepared != null) { var query = onAfterQueryPrepared(request, settings); if (query != null) request = query.Cast<T>(); } if (settings.GridSettings.IsSearch) { switch (settings.Filter.Operator) { case SearchOperator.Equal: request = request.Equal(settings.Filter.SearchField, settings.Filter.SearchString); break; case SearchOperator.NotEqual: request = request.NotEqual(settings.Filter.SearchField, settings.Filter.SearchString); break; case SearchOperator.Contains: request = request.WhereContains(settings.Filter.SearchField, settings.Filter.SearchString); break; } } var totalRecords = request.Count(); var totalPages = (int)Math.Ceiling(totalRecords / (float)pageSize); var userGroups = request .OrderBy(!settings.GridSettings.Asc, settings.GridSettings.SortColumn) .Skip(pageIndex * pageSize) .Take(pageSize); return new JsonResult { Data = new { total = totalPages, settings.GridSettings.PageIndex, records = totalRecords, rows = ( userGroups.AsEnumerable().Select(t => new { id = modelType.GetProperty(settings.IdField).GetValue(t).ToString(), cell = GetDataFromColumns(modelType, settings, t) }).ToList()) }, ContentType = null, ContentEncoding = null, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; }
рдлрд╝рдВрдХреНрд╢рди рд▓реБрдХрдЕрдк рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдо рдкреГрд╖реНрдард╛рдВрдХрди, рдмреБрдирд┐рдпрд╛рджреА рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдЦреЛрдЬ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╕реНрддрдВрдн рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА GetDataFromColumns рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕реВрдЪреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП LookupGridColumnsAttribute рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрд╕рдХрд╛ рдХреЛрдб рд╣реИ: private static IEnumerable<string> GetDataFromColumns(Type model, LookupSettings settings, object instance) { var dataArray = new List<string> { model.GetProperty(settings.IdField).GetValue(instance).ToString(), model.GetProperty(settings.NameField).GetValue(instance).ToString() }; var gridColumns = model.GetCustomAttributeByType<LookupGridColumnsAttribute>(); if (gridColumns != null) { dataArray.AddRange(from column in gridColumns.LookupColumns select model.GetProperty(column).GetValue(instance) into val where val != null select val.ToString()); } return dataArray; }
рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рдореВрд▓реНрдп рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдореЙрдбрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ, рд╣рдо рд▓реБрдХрдЕрдкрдЧреНрд░рд┐рдбрдХреЛрд▓реНрдпреВрдореЗрдВрдЯреНрд╕ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕реНрддрдВрдн рдорд╛рдиреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВредрдЕрдм рдореВрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЬреЛ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдореЛрдб рдореЗрдВ рдлреЙрд░реНрдо рдкрд░ рд╕рднреА рд▓реБрдХрдЕрдк рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ public class LookupBasicController : Controller { protected virtual DbContext GetDbContext { get { throw new NotImplementedException("You have to implement this method to return correct db context"); } } protected virtual IQueryable LookupBaseQuery(IQueryable query, LookupSettings settings) { return null; } public virtual ActionResult LookupData([ModelBinder(typeof(LookupModelBinder))] LookupSettings settings) { return LookupDataResolver.BasicLookup(settings, GetDbContext, LookupBaseQuery); } public virtual ActionResult LookupDataGrid([ModelBinder(typeof(LookupModelBinder))] LookupSettings settings) { return LookupDataResolver.BasicGrid(settings, GetDbContext, LookupBaseQuery); }
рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╡рд░реНрдЧ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрджрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд▓реБрдХрдЕрдкрдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рдиред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдзрд╛рд░ рдХреНрд╡реЗрд░реА рдмрдирд╛рддреЗ рд╕рдордп LookupSearch рдФрд░ LookupDataForGrid рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЗрдПрд╕ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдПрдЪрдЯреАрдПрдордПрд▓ рд╕рд╣рд╛рдпрдХ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, jqGrid рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдирд┐рдореНрди рдкреИрдЯрд░реНрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирддрд╛ рд╣реИ: HTML рд╣реЗрд▓реНрдкрд░ + рдЧреНрд░рд┐рдб рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдоред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, JS рд▓реБрдХрдЕрдкрдбреЗрдЯрд╛ рдФрд░ рд▓реБрдХрдЕрдкрдбреЗрдЯрд╛рдЧреНрд░рд┐рдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛редрдЗрд╕ рдкрд░ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдШрдЯрдХ рдХреЗ рдореВрд▓ рддрддреНрд╡реЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╕реНрд░реЛрдд рдореЗрдВ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЗрдПрд╕, рдЬреЛ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рдХрд╛рдо рдХреЗ рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдорд╛рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд░реБрдЪрд┐ рдХрд╛ рдирд╣реАрдВ рд╣реИред5. рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг
рдЙрди рдореЙрдбрд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рдЧрдП рдереЗред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рд╕рдВрдЪрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред [Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public string UserName { get; set; } [Lookup(Model = typeof(UserGroup), NameField = "GroupName")] public int? UserGroupId { get; set; } public virtual UserGroup UserGroup { get; set; } } [LookupGridColumns(new[] { "Description" })] public class UserGroup { [Key] public int UserGroupId { get; set; } [DisplayName("Group Name")] public string GroupName { get; set; } [DisplayName("Group Description")] public string Description { get; set; } public virtual ICollection<UserProfile> Users { get; set; } }
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ UserProfile рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд▓реБрдХрдЕрдк рд▓рд┐рдВрдХ рдХреЛ UserGroup рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдкрд╛рдареАрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред UserGroud рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ, LookupGridColumns рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдХреЙрд▓рдо рдЬрд┐рд╕реЗ рдЖрдк рджреГрд╢реНрдп рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдм рд╣реИ, рдЕрдм рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдЬрд╛рдПрдВред public class UserListController : LookupBasicController { private readonly DataBaseContext _db = new DataBaseContext(); protected override DbContext GetDbContext { get { return _db; } }
рд╣рдо LookupBasicController рдФрд░ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо GetDbContext рд╕реЗ db рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП LookupBasicController рдкрд╣реБрдБрдЪ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗред public ActionResult Edit(int id = 0) { UserProfile userprofile = _db.UserProfiles.Include(c => c.UserGroup) .SingleOrDefault(x => x.UserId == id); if (userprofile == null) { return HttpNotFound(); } return View(userprofile); }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛редрдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗрдЯрдЕрдк рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рджреГрд╢реНрдп рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред @using TestApp.Models @model UserProfile @{ ViewBag.Title = "Edit"; } @Styles.Render("~/Content/JqGrid") <h2>Edit</h2> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>UserProfile</legend> @Html.HiddenFor(model => model.UserId) <div class="editor-label"> @Html.LabelFor(model => model.UserName) </div> <div class="editor-field"> @Html.EditorFor(model => model.UserName) @Html.ValidationMessageFor(model => model.UserName) </div> <div class="editor-label"> @Html.LabelFor(model => model.UserGroupId) </div> <div class="editor-field"> @Html.LookupFor(model => model.UserGroupId) @Html.ValidationMessageFor(model => model.UserGroupId ) </div> <p> <input type="submit" value="Save" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/lookup") @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/bundles/jqueryui") @Scripts.Render("~/bundles/jqgrid") }
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓рд┐рдкрд┐рдХ, рд▓реБрдХрдЕрдк рдЖрджрд┐ рдЬреИрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯред рдЖрдк рд▓реЗрдЦ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдПрдХ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реАрд▓реНрдб рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЦреЛрдЬрдиреЗ рдФрд░ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд╛рдВрдЫрд┐рдд рддрддреНрд╡ рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рддрддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЬрд▓реНрджрдмрд╛рдЬреА рд╣реЛрдЧреА, рдмрд╣реБрдд рдХреБрдЫ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдмрд╛рдХреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдб рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдЪрд░рдг рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИредрдпрд╣ рд╕рдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
6. рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╣рдордиреЗ рдХреБрдЫ рд╕рдордп рдПрдХ рдШрдЯрдХ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛, рдЬреЛ рд╣рдорд╛рд░реА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдо рдЙрддреНрдкрд╛рдж ASP.net MVC рднрдпрд╛рдирдХ 3.5 рдкрд░ рдмрд╕ рдЧрдПред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ MVC рд╡рд┐рд╕реНрдордпрдХрд╛рд░реА рд▓реБрдХрдЕрдк рдШрдЯрдХ рдХрд╛рдлреА рд▓рдЪреАрд▓рд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╕рдм рдХреБрдЫ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдХреЛрдб рджреЗрдЦреЗрдВ: Awe рд▓реБрдХрдЕрдк ред рдЙрдиреНрд╣реЗрдВ рдмрд╣реБ-рдЪрдпрди рд╕рдорд░реНрдерди рднреА рд╣реИредрдШрдЯрдХ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: TestApp.zip редрдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдЖрдкрдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдереА!