在FineUIPro中,咱们能够将公用的部分定义为一个用户控件,而后添加到页面中。html
一个简单的示例:http://pro.fineui.com/#/usercontrol/userinfo.aspxmvc
首先定义用户控件:UserInfoControl布局
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserInfoControl.ascx.cs" Inherits="FineUIPro.Examples.usercontrol.UserInfoControl" %> <f:Panel runat="server" ID="Panel1" BodyPadding="10px" Title="用户控件"> <Items> <f:Label runat="server" ID="labUserInfo"> </f:Label> </Items> </f:Panel>
这个用户控件能够接受一系列的参数,这些参数是在后台C#类中定义的:学习
public partial class UserInfoControl : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { LoadData(); } } private void LoadData() { labUserInfo.Text = String.Format("{0}今年{1}岁,住在{2}。", UserName, UserAge, UserCountry); // 布局相关定义 if (BoxFlex != null) { Panel1.BoxFlex = BoxFlex.Value; } if (!String.IsNullOrEmpty(Margin)) { Panel1.Margin = Margin; } } private int? boxFlex; public int? BoxFlex { get { return boxFlex; } set { boxFlex = value; } } private string margin; public string Margin { get { return margin; } set { margin = value; } } private string userName; public string UserName { get { return userName; } set { userName = value; } } private int userAge; public int UserAge { get { return userAge; } set { userAge = value; } } private string userCountry; public string UserCountry { get { return userCountry; } set { userCountry = value; } } }
UserName,UserAge和UserCountry做为三个基本的参数,分别对应某个用户的姓名、年龄和籍贯。ui
在页面中直接使用此用户控件:spa
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="userinfo.aspx.cs" Inherits="FineUIPro.Examples.usercontrol.userinfo" %> <%@ Register Src="UserInfoControl.ascx" TagName="UserInfoControl" TagPrefix="uc1" %> <!DOCTYPE html> <html> <head runat="server"> <title></title> <meta name="sourcefiles" content="~/usercontrol/UserInfoControl.ascx" /> </head> <body> <form id="form1" runat="server"> <f:PageManager ID="PageManager1" runat="server"></f:PageManager> <f:ContentPanel runat="server" ID="Panel1" IsFluid="true" CssClass="blockpanel" EnableCollapse="false" BodyPadding="10px" Height="200px" Title="面板一(ContentPanel->UserInfoControl)"> <uc1:UserInfoControl ID="UserInfoControl1" UserName="陈萍萍" UserAge="20" UserCountry="合肥" runat="server" /> </f:ContentPanel> </form> </body> </html>
使用本用户控件遵照先声明再引用的规则:3d
1. 使用 Register 指令来定义用户控件标签前缀为 uc1。code
2. 在页面中直接插入:uc1:UserInfoControl 便可。orm
本例中,使用ContentPanel做为容器,由于能够直接在ContentPanel中放置HTML标签,而用户控件也属于HTML标签的一个扩展,因此能够直接使用。server
页面效果:
上面介绍的用户控件和用法属于ASP.NET的原生支持,FineUIPro没有作任何扩展。可是仅仅是这样远远不够,由于FineUIPro要对控件的位置作精确的定位。
这就须要用到布局!而布局是层层嵌套的,若是将用户控件放到父页面的布局结构中呢?
FineUIPro给出了本身的解决方案,这就是:UserControlConnector
基本用法以下:
<f:Panel runat="server" ID="Panel3" IsFluid="true" CssClass="blockpanel" Height="200px" EnableCollapse="false" BodyPadding="10px" Layout="Fit" Title="面板三(Layout=Fit, Panel->UserControlConnector->UserInfoControl)"> <Items> <f:UserControlConnector runat="server"> <uc1:UserInfoControl ID="UserInfoControl3" UserName="陈萍萍" UserAge="20" UserCountry="合肥" runat="server" /> </f:UserControlConnector> </Items> </f:Panel>
在这个示例中,有以下布局相关构思:
1. 最外层 Panel3 拥有 Layout=Fit 布局定义,也就是但愿内部放置一个 FineUIPro 子容器
2. 子容器经过 UserInfoControl 来定义,外部嵌套一个 UserControlConnector 控件
3. UserInfoControl 中只放置一个 FineUIPro 控件:Panel
注:UserInfoControl 没法直接放到Items 标签中,由于它不是 FineUIPro 控件。
页面显示效果:
能够看到,Layout=Fit布局已经生效,内部面板已经占据了面板三的所有高度,能够和上一个示例对比下显示效果。
而用户控件链接器的做用仅用于将用户控件链接到 FineUIPro 的页面层次结构中并参与布局,自己并不显示和输出!
用户控件链接器能够参与复杂的布局,请看下面这个例子:
<f:Panel runat="server" ID="Panel2" IsFluid="true" CssClass="blockpanel" EnableCollapse="false" Height="300px" Layout="VBox" BodyPadding="10px" BoxConfigChildMargin="0 0 5 0" Title="面板三"> <Items> <f:UserControlConnector ID="UserControlConnector2" runat="server"> <uc1:UserInfoControl ID="UserInfoControl2" UserName="陈萍萍" BoxFlex="1" UserAge="20" UserCountry="合肥" runat="server" /> </f:UserControlConnector> <f:UserControlConnector ID="UserControlConnector3" runat="server"> <uc1:UserInfoControl ID="UserInfoControl3" Margin="0" BoxFlex="1" UserName="胡斐" UserAge="22" UserCountry="驻马店" runat="server" /> </f:UserControlConnector> </Items> </f:Panel>
有关布局的信息:
1. 最外层面板定义了 Layout=VBox 布局
2. 两个子容器分别定义布局属性 BoxFlex=1,标识两个子容器高度相同,平分父容器的整个空间。
页面显示效果:
将此示例稍做修改,把父容器的布局改成Layout=HBox,并修改BoxConfigChildMargin属性(定义子容器的外边距):
<f:Panel runat="server" ID="Panel5" IsFluid="true" CssClass="blockpanel" EnableCollapse="false" Height="300px" Layout="HBox" BodyPadding="10px" BoxConfigChildMargin="0 5 0 0" Title="面板三"> <Items> <f:UserControlConnector ID="UserControlConnector5" runat="server"> <uc1:UserInfoControl ID="UserInfoControl6" UserName="陈萍萍" BoxFlex="1" UserAge="20" UserCountry="合肥" runat="server" /> </f:UserControlConnector> <f:UserControlConnector ID="UserControlConnector6" runat="server"> <uc1:UserInfoControl ID="UserInfoControl7" Margin="0" BoxFlex="1" UserName="胡斐" UserAge="22" UserCountry="驻马店" runat="server" /> </f:UserControlConnector> </Items> </f:Panel>
如今页面的显示效果:
=========================================================================================
=====我是分割线=========我是分割线==========我是分割线============我是分割线===================
=========================================================================================
在FineUIMvc中,咱们能够将公用的部分定义为一个分部视图,而后添加到页面中。
一个简单的示例:http://mvc.fineui.com/#/Partial/Partial
注:本链接尚不可用,需等待 FineUIMvc v5.3.0 发布后上线。
首先定义用户控件:PartialView
@{
var F = Html.F();
}
@{
var UserName = ViewData["UserName"].ToString();
var UserAge = Convert.ToInt32(ViewData["UserAge"]);
var UserCountry = ViewData["UserCountry"].ToString();
}
@{
var Panel1 = F.Panel().BodyPadding(10).Title("分部视图")
.Items(
F.Label().ID("labUserInfo").Text(String.Format("{0}今年{1}岁,住在{2}。", UserName, UserAge, UserCountry))
);
if (ViewData["BoxFlex"] != null)
{
Panel1.BoxFlex(Convert.ToInt32(ViewData["BoxFlex"]));
}
if (ViewData["Margin"] != null)
{
Panel1.Margin(Convert.ToInt32(ViewData["Margin"]));
}
}
@(Panel1)
这个用户控件能够接受一系列的参数,这些参数能够直接定义在视图中,参数是经过ViewData传入的。
UserName,UserAge和UserCountry做为三个基本的参数,分别对应某个用户的姓名、年龄和籍贯。
在页面中直接使用此用户控件:
<div id="container1"> @(Html.Partial("PartialView", new ViewDataDictionary(ViewData) { { "UserName", "陈萍萍" }, { "UserAge", 20 }, { "UserCountry", "合肥" } })) </div> @(F.Panel().ID("Panel1").IsFluid(true).CssClass("blockpanel").EnableCollapse(false).BodyPadding(10).Height(200).Title("面板一(Panel->PartialView)").ContentEl("#container1") )
使用Html.Partial直接在父页面中引入分部视图:
1. Html.Partial的第一个参数指定分部视图的名称
2. 第二个参数指定传入分部视图的参数ViewData。
本例中,使用 Panel 做为容器,因为不能在Panel中放置HTML标签,因此咱们将分部视图渲染到一个DIV节点中(id=content1),而后在Panel1中使用 Content("#container1") 来调用。
页面效果:
上面介绍的用户控件和用法属于ASP.NET MVC的原生支持,FineUIMvc没有作任何扩展。可是仅仅是这样远远不够,由于FineUIMvc要对控件的位置作精确的定位。
这就须要用到布局!而布局是层层嵌套的,若是将用户控件放到父页面的布局结构中呢?
FineUIMvc给出了本身的解决方案,这就是:PartialConnector
基本用法以下:
@(F.Panel().ID("Panel3").IsFluid(true).CssClass("blockpanel").Height(200).EnableCollapse(false).BodyPadding(10).Layout(LayoutType.Fit).Title("面板三(Layout=Fit, Panel->PartialConnector->PartialView)")
.Items(
F.PartialConnector().Content(Html.Partial("PartialView", new ViewDataDictionary(ViewData) { { "UserName", "陈萍萍" }, { "UserAge", 20 }, { "UserCountry", "合肥" } }))
)
)
在这个示例中,有以下布局相关构思:
1. 最外层 Panel3 拥有 Layout=Fit 布局定义,也就是但愿内部放置一个 FineUIMvc 子容器
2. 子容器经过 Html.Partial 来引入,外部嵌套一个 PartialConnector 控件
3. PartialView 中只放置一个 FineUIMvc 控件:Panel
注:Html.Partial 没法直接放到 Items 属性中,由于它不是 FineUIMvc 控件扩展。
页面显示效果:
能够看到,Layout=Fit布局已经生效,内部面板已经占据了面板三的所有高度,能够和上一个示例对比下显示效果。
而分部视图链接器的做用仅用于将分部视图链接到 FineUIMvc 的页面层次结构中并参与布局,自己并不显示和输出!
分部视图链接器能够参与复杂的布局,请看下面这个例子:
@(F.Panel().ID("Panel2").IsFluid(true).CssClass("blockpanel").EnableCollapse(false).Height(300).Layout(LayoutType.VBox).BodyPadding(10).BoxConfigChildMargin("0 0 5 0").Title("面板三")
.Items(
F.PartialConnector().Content(Html.Partial("PartialView", new ViewDataDictionary(ViewData) { { "UserName", "陈萍萍" }, { "UserAge", 20 }, { "UserCountry", "合肥" }, { "BoxFlex", 1 } })),
F.PartialConnector().Content(Html.Partial("PartialView", new ViewDataDictionary(ViewData) { { "UserName", "胡斐" }, { "UserAge", 22 }, { "UserCountry", "驻马店" }, { "BoxFlex", 1 }, { "Margin", 0} }))
)
)
有关布局的信息:
1. 最外层面板定义了 Layout=VBox 布局
2. 两个子容器分别定义布局属性 BoxFlex=1,标识两个子容器高度相同,平分父容器的整个空间。
页面显示效果:
将此示例稍做修改,把父容器的布局改成Layout=HBox,并修改BoxConfigChildMargin属性(定义子容器的外边距):
@(F.Panel().ID("Panel4").IsFluid(true).CssClass("blockpanel").EnableCollapse(false).Height(300).Layout(LayoutType.HBox).BodyPadding(10).BoxConfigChildMargin("0 5 0 0").Title("面板四")
.Items(
F.PartialConnector().Content(Html.Partial("PartialView", new ViewDataDictionary(ViewData) { { "UserName", "陈萍萍" }, { "UserAge", 20 }, { "UserCountry", "合肥" }, { "BoxFlex", 1 } })),
F.PartialConnector().Content(Html.Partial("PartialView", new ViewDataDictionary(ViewData) { { "UserName", "陈萍萍" }, { "UserAge", 20 }, { "UserCountry", "合肥" }, { "BoxFlex", 1 }, { "Margin", 0 } }))
)
)
如今页面的显示效果:
为了在 FineUIMvc 中使用分部视图,并在页面层次结构中引入分部视图并参与布局,咱们引入了 PartialConnector 控件,这个控件的做用仅用于链接分部视图和现有的FineUIMvc控件,自己不会在页面上显示。经过这篇文章的对比,咱们能够发现 FineUIMvc 中新引入的 PartialConnector 控件和咱们以前在 FineUIPro 用的 UserControlConnector 几乎如出一辙,方便老用户学习和使用,看似不起眼的类似印证了咱们的一向的坚持和一切为了简单的理念。
注:FineUIMvc 中的 PartialConnector 属于 v5.3.0 新增控件,需等待新版发布后才可使用。