ASP.NET MVC рдореЗрдВ рдкреЗрдЬ / рдорд╛рд╕реНрдЯрд░рдкреЗрдЬ / UserControl рдЯреИрдЧ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ PHP рд╕реЗ ASP.NET рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдЗрдВрдЬрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рд╕реНрдорд╛рд░реНрдЯреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ ASP.NET MVC рдкреНрд░рд╕реНрддреБрддрд┐ рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдбреЛрдкрд┐рд▓реНрдХрд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред So.

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ (рдЪрд▓реЛ рдЗрд╕реЗ рдореЗрди рдХрд╣рддреЗ рд╣реИрдВ) - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдереАрдо рдореИрдиреЗрдЬрд░, рдХреЙрд▓рд┐рдВрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рддрд░реАрдХреЗ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдорд╛рдирдХ рд╡рд░реНрдЧ System.Web.Mvc.ViewPage рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЖрдк ViewContext.Controller рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде <% = ((IndexController) ViewContext.Controller) .ContTheme.Name%>, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдФрд░ рд▓реЗрдЦрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИред рдореИрдВ System.Web.Mvc.ViewPage (рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ System.Web.Mvc.MasterPage рдФрд░ System.Web.Mvc.UserControl) рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдорд╛рд░реНрдЧ рдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╕рдореЗрдВ ControlHelper рдЧреБрдг рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ, рдорд╛рд╕реНрдЯрд░рдкреЗрдЧрдлрд╛рдЗрд▓ рдХреЗ рд╕реАрдзреЗ рд░рд╛рд╕реНрддреЗ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛ "рдХрд░рдВрдЯрдЯреЗрдо.рд╕рд╛рдЗрдЯрдорд╛рд╕реНрдЯрд░", "рдпреВрдЬрд░рдЯреЗрдо.рд╕рд╛рдЗрдЯрдорд╛рд╕реНрдЯрд░", рдЖрджрд┐ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬрдм рдкреГрд╖реНрда рдирд┐рд░реНрджреЗрд╢ рдХреЗ MasterPageFile рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд▓рд╛рдЗрди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ "~ / Views / {CurrentTheme.SiteMaster}" рдлрд╝рд╛рдЗрд▓ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдПрдХ рдкрд╛рд░реНрд╕рд░ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдкреГрд╖реНрда рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MasterPagePath:
<%@ Page Language="C#" MasterPagePath="{CurrentTheme.SiteMaster}" Inherits="..." %> 


рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдорд╡реАрд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рддреЛ рд╣рдордиреЗ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╣реЛрдордХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рдпрд╛, рдПрдХ рд╕рд╛рдЗрдЯ 1редрдорд╛рд╕реНрдЯрд░ рдореБрдЦреНрдп рдкреГрд╖реНрда рдмрдирд╛рдпрд╛, рд╕рд╛рдЗрдЯ 1редрдорд╛рд╕реНрдЯрд░ рдореБрдЦреНрдп рдкреГрд╖реНрда рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рджреГрд╢реНрдп / рд╣реЛрдо / рдЗрдВрдбреЗрдХреНрд╕.рд╕реНрдкреЗрдХреНрд╕ рджреГрд╢реНрдп рдмрдирд╛рдпрд╛ред
 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Site1.Master" Inherits="MvcHelperApplication.Inc.Types.ViewPage" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"><h2>Index</h2></asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server"> </asp:Content> 


рдлрд┐рд░ рд╣рдо рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреГрд╖реНрда рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ:
 <%@ Page Title="" Language="C#" MasterPagePath="{CurrentMasterPath}" Inherits="MvcHelperApplication.Inc.Types.ViewPage" %> 


MvcHelperApplication.Inc.Types.ViewPage рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкреГрд╖реНрда рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдереЛрдбрд╝рд╛ рдХрдо рд▓рд┐рдЦреЗрдВрдЧреЗред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдкреГрд╖реНрда рдХреА рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛ MasterPagePath рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдХреА MasterPageFile рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcHelperApplication.Inc { public class ControlHelper { private Types.ViewPage mPage = null; public ControlHelper(Types.ViewPage page) { mPage = page; } public void page_PreInit(object sender, EventArgs e) { try { if (mPage.MasterPagePath != null && mPage.MasterPagePath == "{CurrentMasterPath}") { mPage.MasterPageFile = "~/Views/Site1.Master"; } } catch (Exception ex) { } } } } 


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдХреНрд╖рдг рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдп рдФрд░ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдкреГрд╖реНрда рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ MasterPagePath рдЯреИрдЧ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ "{CurrentMasterPath}" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ MasterPageFile рдЧреБрдг рдореМрдЬреВрджрд╛ Masterpage рдХреЗ рдкрде рдкрд░ рд╕реЗрдЯ рд╣реИред

ViewPage рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:
 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Html; using System.Web.UI; using System.Diagnostics.CodeAnalysis; namespace MvcHelperApplication.Inc.Types { public class ViewPage : System.Web.Mvc.ViewPage { private string _masterpagepath = ""; public string MasterPagePath { get { return _masterpagepath; } set { _masterpagepath = value; } } public ViewPage() { this.PreInit += new EventHandler(ControlHelper.page_PreInit); } private ControlHelper mControlHelper = null; public ControlHelper ControlHelper { get { if (mControlHelper == null) mControlHelper = new ControlHelper(this); return mControlHelper; } } } } 


рдХреНрд░рдо рдореЗрдВ рдкрд╛рд░реНрд╕ред
1) MasterPagePath рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдЧ рдХреЛ рдкреГрд╖реНрда рдирд┐рд░реНрджреЗрд╢ рд╕реЗ MasterPagePath рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
2) рд╡реНрдпреВрдкреЗрдЬ - рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЗ рдкреЗрдЬ_рдкреНрд░реАрдд рдкрджреНрдзрддрд┐ рдХреЛ рдкреНрд░реАрдЗрдВрдЯрд░рдЯ рдШрдЯрдирд╛ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
3) рдХрдВрдЯреНрд░реЛрд▓ рд╣реЗрд▓реНрдкрд░ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЗрд▓реНрдкрд░ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИред

рд╣рдо рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреГрд╖реНрда рдкрд░ рд╕реБрдВрджрд░ рд╢рдмреНрдж рд╕реВрдЪрдХрд╛рдВрдХ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╣рд╛рди, рд╣рдо рдЕрдм рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ MasterPageFile рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдереАрдо, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдЖрджрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рдереАред - рдпрд╣ ControlHelper рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
 <%=ControlHelper.Config%> <%=ControlHelper.Themes.Current%> 

рдЖрджрд┐

рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрджреНрднреБрдд рд╣реИред рд▓реЗрдХрд┐рди рдирд╣реАрдВ, ASP.NET рдиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдмрджрд╕реВрд░рдд рдХреБрддреНрддрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╡рдЬрд╣ рд╕реЗ рдореБрдЭреЗ рдПрдХ рджрд┐рди рдЦреБрджрд╛рдИ рдореЗрдВ рдЧреБрдЬрд╛рд░рдирд╛ рдкрдбрд╝рд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ ASP.NET рдкрд╛рд░реНрд╕рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ Inherits = "MvcHelperApplication.Inc.Types.ViewPage" рдХреЗ рдмрдЬрд╛рдп Index.aspx рдореЗрдВ Inherits = "MvcHelperApplication.Inc.Types.ViewPage" рд▓рд┐рдЦреЗрдВ (рдЕрд░реНрдерд╛рдд, рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИред рдФрд░ MVC рдХреЗ рд╕рд╛рде рд╕рднреА рдЙрдкрджреНрд░рд╡ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ), рддреЛ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
 :    ,     .            .     :     'masterpagepath':  'System.Web.Mvc.ViewPage'      'masterpagepath'.  :  1: <%@ Page Title="" Language="C#" MasterPagePath="{CurrentMasterPath}" Inherits="MvcHelperApplication.Inc.Types.ViewPage<dynamic>" %> 


рдЪрд▓рд┐рдП ViewPage рдХреНрд▓рд╛рд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╢рд╛рдВрддрд┐ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓реЗрдВ:
  public class ViewPage<TModel> : System.Web.Mvc.ViewPage<TModel> 


рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░реНрдЪреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреЗрдЬрд░рд╕рд░рдлрд┐рд▓реНрдЯрд░ рдЯрд╛рдЗрдк рдЬреИрд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред Web.config рдореЗрдВ, <system.web> рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрд╛ рд╣реИ:
 <pages validateRequest="false" pageParserFilterType="MvcHelperApplication.Inc.ViewTypeParserFilter" pageBaseType="MvcHelperApplication.Inc.Types.ViewPage"> 


ViewTypeParserFilter рдмрдирд╛рдПрдБ:

 using System; using System.Collections; using System.Web.UI; using System.Web.Mvc; using System.CodeDom; using System.Web.UI; namespace MvcHelperApplication.Inc { public class ViewTypeParserFilter : PageParserFilter { private string _viewBaseType; private DirectiveType _directiveType = DirectiveType.Unknown; private bool _viewTypeControlAdded; public override void PreprocessDirective(string directiveName, IDictionary attributes) { base.PreprocessDirective(directiveName, attributes); string defaultBaseType = null; switch (directiveName) { case "page": _directiveType = DirectiveType.Page; defaultBaseType = typeof(Types.ViewPage).FullName; break; case "control": _directiveType = DirectiveType.UserControl; defaultBaseType = typeof(System.Web.Mvc.ViewUserControl).FullName; break; case "master": _directiveType = DirectiveType.Master; defaultBaseType = typeof(System.Web.Mvc.ViewMasterPage).FullName; break; } if (_directiveType == DirectiveType.Unknown) return; string inherits = (string)attributes["inherits"]; if (!String.IsNullOrEmpty(inherits)) { if (IsGenericTypeString(inherits)) { attributes["inherits"] = defaultBaseType; _viewBaseType = inherits; } } } private static bool IsGenericTypeString(string typeName) { return typeName.IndexOfAny(new char[] { '<', '(' }) >= 0; } public override void ParseComplete(ControlBuilder rootBuilder) { base.ParseComplete(rootBuilder); ViewPageControlBuilder pageBuilder = rootBuilder as ViewPageControlBuilder; if (pageBuilder != null) { pageBuilder.PageBaseType = _viewBaseType; } } public override bool ProcessCodeConstruct(CodeConstructType codeType, string code) { if (codeType == CodeConstructType.ExpressionSnippet && !_viewTypeControlAdded && _viewBaseType != null && _directiveType == DirectiveType.Master) { Hashtable attribs = new Hashtable(); attribs["typename"] = _viewBaseType; AddControl(typeof(System.Web.Mvc.ViewType), attribs); _viewTypeControlAdded = true; } return base.ProcessCodeConstruct(codeType, code); } public override bool AllowCode { get {return true;} } public override bool AllowBaseType(Type baseType) { return true; } public override bool AllowControl(Type controlType, ControlBuilder builder) { return true; } public override bool AllowVirtualReference(string referenceVirtualPath, VirtualReferenceType referenceType) { return true; } public override bool AllowServerSideInclude(string includeVirtualPath) { return true; } public override int NumberOfControlsAllowed { get {return -1;} } public override int NumberOfDirectDependenciesAllowed { get {return -1;} } public override int TotalNumberOfDependenciesAllowed { get {return -1;} } private enum DirectiveType { Unknown, Page, UserControl, Master, } } public sealed class ViewPageControlBuilder : FileLevelPageControlBuilder { public string PageBaseType { get; set; } public override void ProcessGeneratedCode( CodeCompileUnit codeCompileUnit, CodeTypeDeclaration baseType, CodeTypeDeclaration derivedType, CodeMemberMethod buildMethod, CodeMemberMethod dataBindingMethod) { if (PageBaseType != null) { derivedType.BaseTypes[0] = new CodeTypeReference(PageBaseType); } } } } 


рдлрд╝рд╛рдЗрд▓ ViewPage.cs рдмрджрд▓реЗрдВ

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Html; using System.Web.UI; using System.Diagnostics.CodeAnalysis; namespace MvcHelperApplication.Inc.Types { [FileLevelControlBuilder(typeof(ViewPageControlBuilder))] public class ViewPage : System.Web.Mvc.ViewPage { private string _masterpagepath = ""; public string MasterPagePath { get { return _masterpagepath; } set { _masterpagepath = value; } } public ViewPage() { this.PreInit += new EventHandler(ControlHelper.page_PreInit); } private ControlHelper mControlHelper = null; public ControlHelper ControlHelper { get { if (mControlHelper == null) mControlHelper = new ControlHelper(this); return mControlHelper; } } } [FileLevelControlBuilder(typeof(ViewPageControlBuilder))] public class ViewPage<TModel> : ViewPage where TModel : class { // code copied from source of ViewPage<T> private ViewDataDictionary<TModel> _viewData; public new AjaxHelper<TModel> Ajax { get; set; } public new HtmlHelper<TModel> Html { get; set; } public new TModel Model { get { return ViewData.Model; } } [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public new ViewDataDictionary<TModel> ViewData { get { if (_viewData == null) { SetViewData(new ViewDataDictionary<TModel>()); } return _viewData; } set { SetViewData(value); } } public override void InitHelpers() { base.InitHelpers(); Ajax = new AjaxHelper<TModel>(ViewContext, this); Html = new HtmlHelper<TModel>(ViewContext, this); } protected override void SetViewData(ViewDataDictionary viewData) { _viewData = new ViewDataDictionary<TModel>(viewData); base.SetViewData(_viewData); } } } 


рд╕рдВрдХрд▓рди - рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрджреНрднреБрдд рд╢рдмреНрдж рд╕реВрдЪрдХрд╛рдВрдХ рджреЗрдЦрддреЗ рд╣реИрдВред
рджреГрд╢реНрдп рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ Web.config рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИред рдлрд╝рд╛рдЗрд▓ рджреГрд╢реНрдп / Web.config рдХреЛ рд╣рдЯрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЦреНрдп Web.config рд╕рд╛рдЗрдЯ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдЯреИрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдЧрд╛ред

ViewTypeParserFilter рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рдЖрдк рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдХрдХреНрд╖рд╛рдУрдВ ViewPage, ViewUserControl, ViewMaserPage рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдиреЛрдЯ - рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдЯреИрдЧ рдореЗрдВ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ PageBaseType рдФрд░ userControlBaseType, рд▓реЗрдХрд┐рди MasterpageBaseType рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдбрд░реЛ рдордд, рдпрд╣ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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


All Articles