ASP.NET MVC рдФрд░ рдЗрдХрд╛рдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдлрд╝рд┐рд▓реНрдЯрд░

рдмрд╣реБрдд рдмрд╛рд░ рд╡рд┐рднрд┐рдиреНрди рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдЪрдпрдирд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реЙрд░реНрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрди рдпрд╛ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ 20 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреГрд╖реНрда рд╣реИрдВ? рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдм рдХреБрдЫ рд╕рдВрднрд╛рд▓рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдФрд░ рднреА рдмрджрддрд░ рд╣реИред рдмрд┐рд▓реНрд▓реА рдХреЗ рддрд╣рдд ASP.NET MVC + рдЗрдХрд╛рдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдгред

рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддрд┐рднрд╛ рдФрд░ рдкрд░рд┐рдкреВрд░реНрдг рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рд╣реИрдВ рдЬреЛ рдореИрдВ рдЕрдВрдд рдореЗрдВ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛, рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдмреНрд░ рд╕рдореБрджрд╛рдп рдореБрдЭреЗ рдЙрди рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рджрд┐рдЦрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡рд░реНрдгрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕рд╛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реИ

public class Student { [Key] public int Id { get; set; } //  public string Name { get; set; } //  public string Group { get; set; } //   public short DefYear { get; set; } //    public bool IsDefended { get; set; } } 


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЫрд╛рддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдирд╛рдо, рд╕рдореВрд╣, рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╡рд░реНрд╖ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд▓реЛрдЧреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦреЗрдЧрд╛ред

 public class StudentFilter : FilterModel<Student> { [FilterName("")] [InputType(InputTypeAttribute.InputTypies.TextBox)] public string Name { get; set; } [FilterName("")] [InputType(InputTypeAttribute.InputTypies.TextBox)] public string Group { get; set; } [FilterName(" ")] [InputType(InputTypeAttribute.InputTypies.DropDownList)] [SelectListProperty("DefYearList", "")] public short? DefYear { get; set; } [FilterName("  ")] [InputType(InputTypeAttribute.InputTypies.DropDownList)] [SelectListProperty("IsDefendedList", "")] public bool? IsDefended { get; set; } public SelectList DefYearList { get { return new SelectList(new List<short> { 2011, 2012 }, DefYear); } } public SelectList IsDefendedList { get { var list = new List<object> { {new {Id="true", Title=""}}, {new {Id="false", Title=" "}}, }; return new SelectList(list, "Id", "Title", IsDefended); } } public override Func<Student, bool> FilterExpression { get { return p => (String.IsNullOrEmpty(Name) || p.Name.IndexOf(Name) == 0) && (String.IsNullOrEmpty(Group) || p.Group.ToLower().IndexOf(Group.ToLower()) == 0) && (DefYear == null || p.DefYear == DefYear) && (IsDefended == null || (p.IsDefended == IsDefended)); } } public override void Reset() { Name = null; Group = null; DefYear = null; IsDefended = null; } } 


рдлрд╝рд┐рд▓реНрдЯрд░ рдореЙрдбрд▓ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 var filters = IocContainer.Resolve<IFilterFactory>(); var students = DbContext.Students .Where(Filter.FilterExpression) .OrderBy(s => s.Name) .ToList(); 


рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рджреГрд╢реНрдп рдХреЛрдб, рдЬреЛ рдЙрд╕ рдлреЙрд░реНрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд░рдирд╛ рд╣реЛрдЧрд╛ред

 .................. <h2></h2> @Html.FilterForm(Filters.Find<UserFilter>()) .................. 


рдлрд┐рд▓реНрдЯрд░ рдПрдХ рд╣реА рдлрд┐рд▓реНрдЯрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓рд╛рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕реЗ рдПрдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред

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

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

 public abstract class FilterModel { [Dependency] public IUnityContainer IocContainer { get; set; } public abstract void Reset(); } public abstract class FilterModel<ModelType> : FilterModel { public abstract Func<ModelType, bool> FilterExpression { get; } } 


рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╣рдореЗрд╢рд╛ рдПрдХрддрд╛ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╣рд╛рде рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, IocContainer рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрди рджреЛ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЙрдбрд▓ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд╣реАрдВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рднрдВрдбрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 public interface IFilterFactory { /// <summary> ///     /// </summary> /// <typeparam name="TFilter"></typeparam> /// <returns></returns> TFilter Find<TFilter>() where TFilter : FilterModel; /// <summary> ///    GUID  /// </summary> /// <param name="guidString"></param> /// <returns></returns> FilterModel Find(String guidString); /// <summary> ///    /// </summary> /// <param name="filter"></param> void Replace(FilterModel filter); /// <summary> ///       /// </summary> /// <param name="guidString">guid  </param> void Reset(String guidString); } 


рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдм рдпрд╣ рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИред рдпрд╛рдиреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдлрд┐рд▓реНрдЯрд░ рдХреА рддрд░рд╣ рдПрдХ рдЧрд╛рдЗрдб рдкрд╛рд╕ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред

рдпрд╣рд╛рдБ IFilterFactory рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

 public class DefaultFilterFactory : IFilterFactory { protected List<object> Collection { get; private set; } [InjectionConstructor] public DefaultFilterFactory() { Collection = new List<object>(); } [Dependency] public IUnityContainer IocContainer { get; set; } /// <summary> ///    /// </summary> /// <typeparam name="TFilter"> </typeparam> /// <returns></returns> public TFilter Find<TFilter>() where TFilter : FilterModel { try { return (TFilter)Collection.Single(f => f.GetType().FullName == typeof(TFilter).FullName); } catch { AddNew<TFilter>(); return Find<TFilter>(); } } /// <summary> ///    GUID   /// </summary> /// <param name="guidString">  GUID</param> /// <returns></returns> public FilterModel Find(String guidString) { return (FilterModel)Collection.Single(f => f.GetType().GUID.ToString() == guidString); } public void Replace(FilterModel filter) { try { var old = Collection.SingleOrDefault(f => f.GetType().FullName == filter.GetType().FullName); if (old != null) { if (!Collection.Remove(old)) throw new InvalidOperationException("    "); } } catch (InvalidOperationException) { throw; } catch { //    } Collection.Add(filter); } /// <summary> ///    /// </summary> /// <typeparam name="TFilter"> </typeparam> protected void AddNew<TFilter>() where TFilter : FilterModel { var filter = IocContainer.Resolve<TFilter>(); filter.Reset(); Collection.Add(filter); } /// <summary> ///    GUID   /// </summary> /// <param name="guidString">  GUID</param> /// <returns></returns> public void Reset(String guidString) { try { var filter = Find(guidString); filter.Reset(); } catch { //    } } } 


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддреНрд░ рдХреЗ рднреАрддрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВ ASP.NET MVC рд╕рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдЬреАрд╡рди рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп DI рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк IFilterFactory рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ xml рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕, рдпрд╣рд╛рдБ рдХрд▓реНрдкрдирд╛ рдЕрд╕реАрдо рд╣реЛ рд╕рдХрддреА рд╣реИ ...

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдореЙрдбрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЙрдбрд▓ рдХрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рдпрд╣рд╛рдВ рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛, рдпрд╣ IModelBinder рд╕реЗ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдФрд░ MVC рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбрд▓ рдХрд▓реЗрдХреНрдЯрд░ рдХреА рддрд░рд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛)

 public class FilterBinder { /// <summary> ///   ,      guid  /// </summary> public static string TypeKey { get { return "_filter_type"; } } /// <summary> ///    ,       ///    ,         InputTypeAttribute /// </summary> public static Func<PropertyInfo, bool> IsFilterProperty { get { return p => p.GetCustomAttributes(true).Count(a => a.GetType() == typeof(InputTypeAttribute)) > 0; } } /// <summary> ///   /// </summary> public HttpRequest Request { get; protected set; } /// <summary> /// Unity  /// </summary> [Dependency] public IUnityContainer IocContainer { get; set; } /// <summary> ///   /// </summary> public Type FilterType { get { return IocContainer.Resolve<IFilterFactory>().Find(Request[TypeKey]).GetType(); } } public FilterBinder() { Request = HttpContext.Current.Request; } /// <summary> ///   /// </summary> /// <returns></returns> public FilterModel BindFilter() { var filter = (FilterModel)IocContainer.Resolve(FilterType); //    ,  InputTypeAttribute foreach (var property in FilterType.GetProperties().Where(FilterBinder.IsFilterProperty)) { object value = null; //   ,        ,     if (property.PropertyType == typeof(String)) { value = Request[property.Name]; } //  ,    else { try { var parse = property.PropertyType.GetMethod("Parse", new Type[] { typeof(String) }) ?? property.PropertyType.GetProperty("Value").PropertyType.GetMethod("Parse", new Type[] { typeof(String) }); if (parse != null) value = parse.Invoke(null, new object[] { Request[property.Name] }); } catch { value = null; } } //     property.SetValue(filter, value, null); } return filter; } } 


рдЬрдм рд╣рдо рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрд▓реЗрдХреНрдЯрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВред рдЕрдм рдореИрдВ рдЙрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рджреВрдВрдЧрд╛ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред

 public class _FilterController : ExpandController { public ActionResult SetFilter(string backUrl) { try { var filter = IocContainer.Resolve<FilterBinder>().BindFilter(); if (filter == null) { FlashMessanger.ErrorMessage = "  "; return Redirect(backUrl); } Filters.Replace(filter); } catch { FlashMessanger.ErrorMessage = "  :   . ,  "; } return Redirect(backUrl); } public ActionResult Reset(string backUrl, string filter) { Filters.Reset(filter); return Redirect(backUrl); } } 

(рд╡рд┐рд╕реНрддрд╛рд░рдХрдВрдЯреНрд░реЛрд▓рд░ - рдЙрдиреНрдирдд рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдВрддреНрд░рдХ, рдлреНрд▓реИрд╢рдореЗрдиреНрд╕рд░ - рдЯреЗрдВрдкрдбрд╛рдЯрд╛ рдХреЗ рд▓рд┐рдП рдРрдб-рдСрди, рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рджреЗрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИ)

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рджреЛ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ: рдПрдХ рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ, рджреВрд╕рд░рд╛ рд░реАрд╕реЗрдЯ рд╣реИред рджреЛрдиреЛрдВ, рдЕрдкрдиреЗ рдорд┐рд╢рди рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рдЖрдпрд╛ рдерд╛ред рдФрд░ рдЙрд╕ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реБрдЪрд┐ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдлрд╝рд┐рд▓реНрдЯрд░реНрдб рд╕реЗрдЯ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред

рдХрд╛рд░реНрдп рдХреЗ рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдЕрдкрдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрди рдлрд┐рд▓реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, html рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рдЧрднрдЧ рдХреЛрдИ рдорд╛рд░реНрдХрдЕрдк рд▓рдЪреАрд▓рд╛рдкрди рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕реБрдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

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

 /// <summary> ///   ,   SelectList    /// </summary> public class SelectListPropertyAttribute : Attribute { /// <summary> ///   /// </summary> public string Property { get; set; } /// <summary> ///   null /// </summary> public string OptionLabel { get; set; } public SelectListPropertyAttribute(string property) { Property = property; OptionLabel = String.Empty; } public SelectListPropertyAttribute(string property, string optionLabel) : this(property) { OptionLabel = optionLabel; } } /// <summary> ///               ///          /// </summary> public class InputTypeAttribute : Attribute { public enum InputTypies { TextBox, CheckBox, DropDownList } public InputTypies Type { get; set; } public InputTypeAttribute(InputTypies type) { Type = type; } } /// <summary> ///       /// </summary> public class FilterNameAttribute : Attribute { public string Name { get; set; } public FilterNameAttribute(string name) { Name = name; } } 


рдФрд░ рд╕рд╣рд╛рдпрдХ рдХреЛрдб

 public static class Helpers { /// <summary> ///  ,    /// </summary> private const string CONTROLLER_NAME = "_Filter"; /// <summary> ///      /// </summary> private const string SET_ACTION_NAME = "SetFilter"; /// <summary> ///      /// </summary> private const string RESET_ACTION_NAME = "Reset"; /// <summary> ///    /// </summary> /// <returns></returns> public static IHtmlString FilterForm(this HtmlHelper helper, FilterModel filter, string controllerName = CONTROLLER_NAME, string setActionName = SET_ACTION_NAME, string resetActionName = RESET_ACTION_NAME) { var url = new UrlHelper(HttpContext.Current.Request.RequestContext, helper.RouteCollection); // url      var hrefSet = url.Action(setActionName, controllerName, new { area = "", backUrl = HttpContext.Current.Request.Url }); var result = String.Format("<form action=\"{0}\" method=\"post\">\n\t<div class=\"filters\">", hrefSet); result += helper.Hidden(FilterBinder.TypeKey, filter.GetType().GUID.ToString()).ToString(); result += "<h3></h3>"; //  ,    //    Func<PropertyInfo, string> getFilterName = p => p.GetCustomAttributes(typeof(FilterNameAttribute), true).Any() ? ((FilterNameAttribute)p.GetCustomAttributes(typeof(FilterNameAttribute), true).Single()).Name : p.Name; //  ,  SelectList   Func<PropertyInfo, PropertyInfo> getSelectListProperty = p => !p.GetCustomAttributes(typeof(SelectListPropertyAttribute), true).Any() ? null : p.DeclaringType.GetProperty( ((SelectListPropertyAttribute)p.GetCustomAttributes(typeof(SelectListPropertyAttribute), true).Single()).Property, typeof(SelectList) ); //      Func<PropertyInfo, string> getSelectListOptionLabel = p => !p.GetCustomAttributes(typeof(SelectListPropertyAttribute), true).Any() ? null : ((SelectListPropertyAttribute)p.GetCustomAttributes(typeof(SelectListPropertyAttribute), true).Single()).OptionLabel; //    ,  InputTypeAttribute foreach (var property in filter.GetType().GetProperties().Where(FilterBinder.IsFilterProperty)) { result += "\n\t\t<div class=\"filter_item\">"; result += "\n\t\t\t<span>" + getFilterName(property) + "</span>"; //   ,       var type = (InputTypeAttribute)property.GetCustomAttributes(typeof(InputTypeAttribute), true).Single(); //  html  switch (type.Type) { case InputTypeAttribute.InputTypies.TextBox: result += helper.TextBox(property.Name, property.GetValue(filter, null)).ToString(); break; case InputTypeAttribute.InputTypies.CheckBox: result += helper.CheckBox(property.Name, property.GetValue(filter, null)).ToString(); break; case InputTypeAttribute.InputTypies.DropDownList: var selectList = getSelectListProperty(property) != null ? (SelectList)getSelectListProperty(property).GetValue(filter, null) : new SelectList(new List<object>()); result += String.IsNullOrEmpty(getSelectListOptionLabel(property)) ? helper.DropDownList(property.Name, selectList) : helper.DropDownList(property.Name, selectList, getSelectListOptionLabel(property)); break; } result += "\n\t\t</div>"; } result += "\n\t\t<div class=\"clear\"></div>"; result += String.Format( @"<input type='image' src='{0}' /><a href='{1}'><img src='{2}' alt='' /></a>", url.Content("~/Content/images/button_apply.png"), url.Action(resetActionName, controllerName, new { area = "", backUrl = HttpContext.Current.Request.Url, filter = filter.GetType().GUID }), url.Content("~/Content/images/button_cancel.png") ); return helper.Raw(result + "\n\t</div>\n</form>"); } } 


рд╢рд╛рдпрдж рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрдм рд╢реБрд░реВ рдореЗрдВ рдореИрдВрдиреЗ рдЬрд┐рди рдордВрддреНрд░рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА:

1) рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕рддреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдлрд┐рд▓реНрдЯрд░ рдлреЙрд░реНрдо рднрд░рддрд╛ рд╣реИ рдФрд░ рднреЗрдЬрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдирд┐рд░рд╛рд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╕рд┐рд╕реНрдЯрдо рдЕрдкрдиреЗ рдЧрд╛рдЗрдб рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЬрдм рддрдХ рдореИрдВ рд╕рд╛рде рдирд╣реАрдВ рдЖрдпрд╛ рддрдм рддрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ

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

3) рдлрд╝рд┐рд▓реНрдЯрд░рдореЙрдбрд▓ рд╡рд░реНрдЧ рдХреА рд░реАрд╕реЗрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ InputTypeAttribute рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╕рднреА рдЧреБрдг рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рд╣реИрдВред

4) рдореБрдЭреЗ рдЗрд╕ рд╕рдм рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдкреВрд░реНрдг рд╢реБрджреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред

рдореЗрд░реЗ рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЙрди рд╕рднреА рдХрд╛ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ рдЬреЛ рдЕрдкрдиреА рд░рд╛рдп рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЕрджреНрдпрддрди
рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

 public abstract class FilterModel<ModelType> : FilterModel { public abstract Func<ModelType, bool> FilterExpression { get; } } 


рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдмреЗрд╣рддрд░ рд╣реИ

 public abstract class FilterModel<ModelType> : FilterModel { public abstract Expression<Func<ModelType, bool>> FilterExpression { get; } } 


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧреАред

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


All Articles