使用拼凑URL的方法,实现DotNetNuke在新窗口中打开内容(二)

使用拼凑URL的方法,实现DotNetNuke在新窗口中打开内容(二)

   使用拼凑URL的方法,实现DotNetNuke在新窗口中打开内容(二)

(For博客园)

   

    前面的文章我们讲到,为了实现DotNetNuke在新窗口中查看或者编辑内容,我们需要自己来创建一个属于我们自己的Default.aspx文件,然后,用这个文件来实现我们的目的。

    读者朋友们可能的问题就是:为什么要自己创建一个新的Default.aspx?这样做,是不是已经把DotNetNuke原本清晰的业务逻辑给打乱了?会不会因为这样,而造成原本清晰、简单的DotNetNuke开发层次结构混乱?

    这里需要和大家澄清的是,我们增加一个页面,这个页面,只是为了完成“在新窗口中打开或者编辑内容”这样一个目的,为了同时实现这个目的,并且不影响到DotNetNuke本身的层次结构,我们必须要做到以下的几点:

    1、决不能影响到DotNetNuke的开发结构;

    2、决不能再现有的开发结构中任意增加或者删减;

    3、即使没有我们新增的这个网页,我们也必须要保证DotNetNuke能够正确无误的运行;

    4、所有的底层解析机制,仍然由DotNetNuke完成;

    好了,我个人当然非常喜欢DotNetNuke清晰明了的开发结构,如果影响到这个结构的话,那么,我就宁可不做这件事情了(那就可能要使用其他的CMS系统,与DotNetNuke失之交臂了)。

    好的,下面,我们以Edit.aspx来代指我们新增的页面,首先,我们这个页面将全部复制Default.aspx和其代码文件,将之改名为 Edit.aspx。进行了此项更改之后,当我们再发布我们的模块的时候,就需要将Edit.aspx文件放到DotNetNuke安装目录的根目录下, 同时还需要将之aspx.vb文件放到这个目录下(或者是将编译之后的dll文件放到bin目录下。

    在我们新增的Edit.aspx.vb文件代码的Page_Init方法上,进行一些修改(这个文件原本是从Default.aspx文件复制过来的)

    如下:

            Dim strSkinSrc As String = PortalSettings.ActiveTab.SkinSrc.Replace(“.ascx”, “_mini.ascx”)

            ‘ skin preview

            If (Not Request.QueryString(“SkinSrc”) Is Nothing) Then

                PortalSettings.ActiveTab.SkinSrc = SkinController.FormatSkinSrc(QueryStringDecode(Request.QueryString(“SkinSrc”)) & “.ascx”, PortalSettings)

                ctlSkin = LoadSkin(PortalSettings.ActiveTab.SkinSrc)

            End If

            ‘ load user skin ( based on cookie )

            If ctlSkin Is Nothing Then

                If Not Request.Cookies(“_SkinSrc” & PortalSettings.PortalId.ToString) Is Nothing Then

                    If Request.Cookies(“_SkinSrc” & PortalSettings.PortalId.ToString).Value <> “” Then

                        PortalSettings.ActiveTab.SkinSrc = SkinController.FormatSkinSrc(Request.Cookies(“_SkinSrc” & PortalSettings.PortalId.ToString).Value & “.ascx”, PortalSettings)

                        ctlSkin = LoadSkin(PortalSettings.ActiveTab.SkinSrc)

                    End If

                End If

            End If

            ‘ load assigned skin

            If ctlSkin Is Nothing Then

                If IsAdminSkin(PortalSettings.ActiveTab.IsAdminTab) Then

                    Dim objSkin As UI.Skins.SkinInfo

                    objSkin = SkinController.GetSkin(SkinInfo.RootSkin, PortalSettings.PortalId, SkinType.Admin)

                    If Not objSkin Is Nothing Then

                        PortalSettings.ActiveTab.SkinSrc = objSkin.SkinSrc

                    Else

                        PortalSettings.ActiveTab.SkinSrc = “”

                    End If

                End If

                If PortalSettings.ActiveTab.SkinSrc <> “” Then

                    PortalSettings.ActiveTab.SkinSrc = SkinController.FormatSkinSrc(strSkinSrc, PortalSettings)   ‘PortalSettings.ActiveTab.SkinSrc

                    ctlSkin = LoadSkin(PortalSettings.ActiveTab.SkinSrc)

                End If

            End If

            ‘ error loading skin – load default

            If ctlSkin Is Nothing Then

                ‘ could not load skin control – load default skin

                If IsAdminSkin(PortalSettings.ActiveTab.IsAdminTab) Then

                    PortalSettings.ActiveTab.SkinSrc = Common.Globals.HostPath & SkinInfo.RootSkin & DefaultSkin.Folder & DefaultSkin.AdminDefaultName

                Else

                    PortalSettings.ActiveTab.SkinSrc = Common.Globals.HostPath & SkinInfo.RootSkin & DefaultSkin.Folder & DefaultSkin.DefaultName

                End If

                ctlSkin = LoadSkin(strSkinSrc)          ‘PortalSettings.ActiveTab.SkinSrc)

            End If

            ‘ set skin path

            PortalSettings.ActiveTab.SkinPath = SkinController.FormatSkinPath(strSkinSrc)       ‘PortalSettings.ActiveTab.SkinSrc)

    以上的代码我们就不详细解释了,其实和Default.aspx的代码文件只有很少的差别,那就是:Edit.aspx文件,和Default.aspx 文件不同,这个文件所加载的皮肤文件,是另外一个皮肤文件。比如,对于DotNetNuke 4.9以下的版本来说,我们缺省的皮肤文件可能是Horizontal Menu – Fixed Width.ascx,那么,为了保证我们的界面正常运行,我们就需要在这个目录下(\Portals\_default\Skins\DNN-Blue \)下面,增加一个新的皮肤文件,也就是ascx文件,而这个文件的命名我们上面的程序已经做了规定,就是原来的文件名增加_mini标识符。所以,新的 ascx文件的名称为:Horizontal Menu – Fixed Width_mini.ascx。而这个皮肤的内容是固定的,如下:

<%@ Control language=”vb” CodeBehind=”~/admin/Skins/skin.vb” AutoEventWireup=”false” Explicit=”True” Inherits=”DotNetNuke.UI.Skins.Skin” %>

<%@ Register TagPrefix=”dnn” TagName=”LOGO” Src=”~/Admin/Skins/Logo.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”BANNER” Src=”~/Admin/Skins/Banner.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”NAV” Src=”~/Admin/Skins/Nav.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”SEARCH” Src=”~/Admin/Skins/Search.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”LANGUAGE” Src=”~/Admin/Skins/Language.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”CURRENTDATE” Src=”~/Admin/Skins/CurrentDate.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”BREADCRUMB” Src=”~/Admin/Skins/BreadCrumb.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”USER” Src=”~/Admin/Skins/User.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”LOGIN” Src=”~/Admin/Skins/Login.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”COPYRIGHT” Src=”~/Admin/Skins/Copyright.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”TERMS” Src=”~/Admin/Skins/Terms.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”PRIVACY” Src=”~/Admin/Skins/Privacy.ascx” %>

<%@ Register TagPrefix=”dnn” TagName=”DOTNETNUKE” Src=”~/Admin/Skins/DotNetNuke.ascx” %>

<TABLE cellspacing=”3″ cellpadding=”3″ width=”100%” border=”0″>

  <TR>

    <TD class=”toppane” colspan=”3″ id=”TopPane” runat=”server” valign=”top” align=”center”></TD>

  </TR>

  <TR valign=”top”>

    <TD class=”leftpane” id=”LeftPane” runat=”server” valign=”top” align=”center”></TD>

    <TD class=”contentpane” id=”ContentPane” runat=”server” valign=”top” align=”center”></TD>

    <TD class=”rightpane” id=”RightPane” runat=”server” valign=”top” align=”center”></TD>

  </TR>

  <TR>

    <TD class=”bottompane” colspan=”3″ id=”BottomPane” runat=”server” valign=”top” align=”center”></TD>

  </TR>

</TABLE>

    好的,看上面的内容,实际上,在新的皮肤文件中,我们只引入了TopPane、LeftPane、RightPane、BottomPane等几块内容, 其他的,如菜单、版权声明等,我们全部都删除掉了,这样,就保证我们的程序在这个皮肤下打开的时候,只有我们模块的内容,而没有任何其他的内容。

    好的,到这里,我们总结一下上面我们做了什么事情。

    1、我们为DotNetNuke新增了一个Edit.aspx文件,用这个文件来处理打开内容的问题,这样,就打了一个擦边球,但是对 DotNetNuke的整个机制没有任何影响(也就是,在我们已经开发好的模块上,即使没有这个文件,我们的系统也可以正常运行);

    2、我们的Edit.aspx文件,装载的皮肤文件,和Default.aspx文件不同,只有几个Pane及CSS而已,不包含其他的内容,这样,我们又在皮肤上,打了一个擦边球;

    好了,做好了以上的内容之后,比如我们做了一个简单的模块,这个模块的缺省控制就是一个GridView(或者其他的列表控件),而有一个Edit的控 制,则是我们的内容。根据我们的要求,缺省控制是不需要在新窗口中打开的,就在DotNetNuke的缺省界面上打开就可以了;但是,Edit控制我们希 望在新窗口中打开,并且只有我们的内容,没有其他的内容。好的,比如我们的GridView有一个LinkButton列,这个列是用来链接到编辑内容的 (这里我们就不详细介绍了,建议大家可以去看一下Micheal Washington的
开发教程)。一般的来说,我们是这样导向编辑页面的:

    

    Response.Redirect(EditURL())

   

    有经验的DotNetNuke应该对上面的语句非常熟悉才对,这个语句,是DotNetNuke非常精华的部分,正是由于它的存在,才能够使我们的模块可 以有更多的控制(Control),并且,可以自由的在各个控制之间进行切换,从而,使得模块的“行为”更加任意和自由。我们可以为一个模块定义任意多个 控制(Control),每个控制(Control)可以是一个独立的业务逻辑页面,而通过Response.Redirect(EditUrl())方 法,可以在各个控制之间进行任意的切换,EditUrl有几个不同参数的方法,我们在这里不一一介绍了。但需要强调的是,正是由于有Control解析, 才让我觉得DotNetNuke是几乎是没有任何限制的,我非常喜欢DotNetNuke的这一点。

    好,啰嗦了半天,就是说DotNetNuke的这个调用EditUrl()的方法,我们要改一下(雷!)。

    根据DotNetNuke的解析机制我们知道,当我们转向另外一个页面的时候,既可以使用EditUrl()这样的方法,也可以通过“拼凑”URL的方 法,只要“拼凑”出一个正常的URL,DotNetNuke就可以解析。例如,上面的Response.Redirect(EditUrl())经典的方 法,如果我们用另外一种方式来代替的话,是完全没问题的,这种方式就是:

    <a href=”/Demos/tabid/57/ctl/Edit/mid/368/Edit.aspx”>新增</a>

    或者

    <a href=”/Demos/tabid/57/rowid/125/ctl/Edit/mid/368/Edit.aspx”>编辑</a>

    下面一行,rowid是我们自己定义的参数。

    至于如何拼凑出这样的一个URL,我们在这里暂时不讲,大家可以看一下DotNetNuke的一些开发教程,比较简单(当然,我们在用GridView的 时候,为了不PostBack,我们可能采用的就不是LinkButton来做打开的链接了,而是直接使用Label,然后将Url和内容都赋给 Label等。为了在新窗口而不是当前窗口打开,需要在<a target=_blank 等,我们暂不做介绍)。

    这里,我们有了一个新的页面Edit.aspx,然后,链接内容的时候,我们用Edit.aspx打开,而不是用传统的Default.aspx。OK,我们试一下是否就可以成功了呢?

    事实上,如果只做到这一步,我们仍然是失败的!

    大家可以看到,尽管我们已经使用Edit.aspx进行解析,而且我们的内容也是指定用Edit.aspx文件打开,但是……,最后打开的却仍然是Default.aspx……

    这里,我们就必须要说一下DotNetNuke的Friendly URL的概念了,大家在用host用户登录后,在Host—Host Settings那里可以看到有一个Friendly URL Settings的设置。关于这个Friendly URL,我们用最简单的语言来描述一下。

    本来,DotNetNuke的路径应该是这样的Default.aspx?tabid=11&mid=368&ctl=Edit,但是, 这样的URL并不是“友好”的URL,这个友好,是针对Google等搜索引擎而言的。一言以蔽之,Google等搜索引擎不喜欢这样的URL,在进行信 息收集的时候,这样的URL并不具有优先性,因为Google认为这样的页面是动态的页面,内容可能随时会变化。所以,Google喜欢的URL是像新浪 的新闻一样的,比如:
http://news.sina.com.cn/c/2008-10-16/100716465435.shtml,Google认为,这样的URL更好。所以,为了让Google高兴(好奴才相!),所以,DotNetNuke就把上面的路径变成了/tabid/11/mid/368/ctl/Edit/Default.aspx这样的形式。

    DotNetNuke关于Friendly URL的配置,实际上是放在根目录下的SiteUrls.config文件里面的,这个文件是按照顺序,从上到下来解析的。

    原本的内容是:

<?xml version=”1.0″ encoding=”utf-8″ ?>

<RewriterConfig>

    <Rules>

        <RewriterRule>

            <LookFor>.*DesktopDefault.aspx(.*)</LookFor>

            <SendTo>~/Default.aspx$1</SendTo>

        </RewriterRule>

        <RewriterRule>

            <LookFor>.*EditModule.aspx(.*)</LookFor>

            <SendTo>~/Default.aspx$1</SendTo>

        </RewriterRule>

        <RewriterRule>

            <LookFor>.*/TabId/(\d+)(.*)/Logoff.aspx</LookFor>

            <SendTo>~/Admin/Security/Logoff.aspx?tabid=$1</SendTo>

        </RewriterRule>

        <RewriterRule>

            <LookFor>.*/TabId/(\d+)(.*)/rss.aspx</LookFor>

            <SendTo>~/rss.aspx?TabId=$1</SendTo>

        </RewriterRule>

        <RewriterRule>

            <LookFor>[^?]*/TabId/(\d+)(.*)</LookFor>

            <SendTo>~/Default.aspx?TabId=$1</SendTo>

        </RewriterRule>

    </Rules>

</RewriterConfig>

    我们增加一个规则,我们新增的规则要在Default.aspx解析的前面,也就是说,在解析Default.aspx文件之前,先解析我们的Edit.aspx文件,我们增加的规则如下:

        <RewriterRule>

            <LookFor>[^?]*/TabId/(\d+)(.*)/Edit.aspx</LookFor>

            <SendTo>~/Edit.aspx?TabId=$1</SendTo>

        </RewriterRule>

    关于这个修改,我们暂时不详细讲,总之,其含义就是,如果碰到Edit.aspx文件,直接转到Edit.aspx文件;而如果没有这个规则的话,它会自动的理解为Default.aspx文件。

    注意:这里虽然我们讲的非常简单,但是Friendly URL也是DotNetNuke的一个非常重要的特色,我个人非常喜欢这种方式。有时间的话,我们可以专题来讲。

    好了,我们的工作完成了!

    我们做的事情如下:

  • 增加了一个Edit.aspx文件,这个文件和Default.aspx文件是平行的,但是,在加载皮肤的时候,加载了我们自己定义的皮肤文件;
  • 增加了一个皮肤文件(非常重要),这个皮肤文件去掉了绝大部分的内容,而只有我们希望的内容区域;
  • 在编程的时候,不使用EditUrl()这种方式解析,而使用拼凑URL的方式;
  • 修改SiteUrls.config文件,告诉DotNetNuke,我们的Edit.aspx文件是存在的;

    这就是为了在新窗口中打开或者编辑内容,我们所做的事情。

    大家可以试一下,看是否能够满足您的需要。

    这个专题还有(三),我们将和DotNetNuke本身的无皮肤、无Contaner做一个对比,看看我们的工作是不是值得。

转载于:https://www.cnblogs.com/dnnworkflow/archive/2008/10/16/1312916.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110982.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Laravel 5 如何实现网站在维护模式下允许指定 IP 用户访问(白名单)

    Laravel 5 如何实现网站在维护模式下允许指定 IP 用户访问(白名单)

  • 数组访问越界_数组越界会导致什么问题

    数组访问越界_数组越界会导致什么问题什么是数组访问越界?所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是C语言程序中最常见的错误之一。在C语言中,数组必须是静态的。换而言之,数组的大小必须在程序运行前就确定下来。由于C语言并不具有类似Java等语言中现有的静态分析工具的功能,可以对程序中数组下标取值范围进行严格检查,一旦发现数组上溢或下溢,都会因抛出异常而终止程序。也就是说,C语言并不检验数组边界,数组的两端都有可能越界,从而使其他变量的数据甚

  • 自学Java开发一般需要多久?

    自学Java开发一般需要多久?自学Java开发一般需要多久?相信有很多想转行或者想学习Java的人都会关注这个问题!那我们今天就来说一下这个问题,具体需要多久呢?这个时间因人而异,毕竟每个人的学习能力和效率都是不同的!打个比方,如果你是零基础,每天学习8小时,基本上每天都按时学习的话,大概需要半年多的时间,就能学的差不多了!如果你本身就会C或C++语言,那么Java对你来说也许会简单许多,学起来自然就快了!下面就给大家简单说一下学习方法,让你尽可能快的学会Java!学习路线:…

  • 七牛云大数据平台建设实践

    七牛云大数据平台建设实践七牛云CEO许式伟首次披露七牛云在大数据方向的产品思路。

  • Java高级面试题!69个经典Java面试题和答案详解

    Java高级面试题!69个经典Java面试题和答案详解拼多多一面首先自我介绍参加过哪些项目并发编程三要素?实现可见性的方法有哪些?多线程的价值?创建线程的三种方式的对比?画出线程的状态流转图常用的并发工具类有哪些?CyclicBarrier和CountDownLatch的区别CAS的问题:1、CAS容易造成ABA问题2、不能保证代码块的原子性3、CAS造成CPU利用率增加ReadWriteLock是什么一面面试题答案:拼多多二面自我介绍什么是工厂模式?如何实现单链表的增删操作?让我说意思JVM的分为哪几块

  • flow control 交换机流控[通俗易懂]

    flow control 交换机流控[通俗易懂]配置IEEE802.3X流控制流控制在直连的以太端口上启用,在拥塞期间允许另一端拥塞的节点暂停链路运作来控制流量速率。如果一个端口发生拥塞并且不能接收任何更多的流量,他将通知对端端口停止发送直到这种拥塞情况消失。当本地设备在他本地检测到了任何拥塞,他能够发送一个暂停帧通知链路伙伴或者远程设备已发生拥塞。紧随收到暂停帧之后,远程设备停止发送任何数据包,这样防止在…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号