【问题标题】:Webforms: Inline Literals in .ascx preventing compilationWebforms:.ascx 中的内联文字阻止编译
【发布时间】:2011-02-01 20:29:43
【问题描述】:

我的 .ascx 文件中有以下代码段:

<%@ Control Language="C#" Inherits="MyCompany.Modules.Discovery.ViewDiscovery"
    AutoEventWireup="true" CodeBehind="ViewDiscovery.ascx.cs" %>

<div id="ViewDiscovery_<asp:Literal ID="litModuleId" runat="server" />"></div>
<script type="text/javascript" src="<asp:Literal ID="litControlPath" runat="server" />carousel-jquery.js"></script>
<script type="text/javascript" src="<asp:Literal ID="litControlPath2" runat="server" />discovery-widget.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        var myData = <asp:Literal ID="litContent" runat="server" />;
        var myDiscovery = discovery('<asp:Literal ID="litControlPath3" runat="server" />');
        myDiscovery.json(myData);
        myDiscovery.init("ViewDiscovery_<asp:Literal ID="litModuleId2" runat="server" />");
    });
</script>

正如您可能能够从语法突出显示(或者更确切地说,它的损坏程度)中推断出的那样,如果我尝试使用此 .ascx 文件编译我的 CodeBehind 文件,它会严重失败,因为它无法识别各种文字我在文件中撒了一些东西,因此我的代码隐藏文件无法编译。我必须将它们从它们的位置中删除,将它们放在文件的末尾,不受页面中它们的上下文的影响,编译,然后恢复到原始版本。

当然有更好的方法将文字放入页面中。

编辑:当我打包我的模块并将其安装在另一个 DotNetNuke 实例上时(只要我在编译它时执行该 rigamarole,它就可以在本地正常工作),它会引发错误:

DotNetNuke.Services.Exceptions.ModuleLoadException: The tag contains duplicate 'ID' attributes

相关,还是这里有其他问题?

编辑:我尝试使用&lt;%=variable %&gt;,但没有得到任何结果。这是我的代码隐藏片段:

namespace MyCompany.Modules.Discovery
{
    partial class ViewDiscovery : PortalModuleBase, IActionable
    {
        public string strContent = "Insert Content Here!";

        protected void Page_Load(object sender, System.EventArgs e)
        {
            // Do stuff here!

            this.strContent = "My content!";
        }
    }
}

如果我在我的 ascx 文件中执行此操作:

<%@ Control Language="C#" Inherits="MyCompany.Modules.Discovery.ViewDiscovery"
    AutoEventWireup="true" CodeBehind="ViewDiscovery.ascx.cs" %>

<%=this.strContent %>

...我的页面上没有显示任何内容。查看 .ascx 文件中“this”的上下文会发现它属于“ASP.viewdiscovery_ascx”类型,而不是我预期的“ViewDiscovery”。

【问题讨论】:

    标签: asp.net webforms ascx


    【解决方案1】:

    我没有使用过 DNN,但对于我认为您正在尝试做的事情,内联表达式应该可以工作。

    在你的代码隐藏中有一些属性(或方法):

    protected string ModuleId {get {return "1"; }}
    protected string ModuleId2 {get {return "2"; }}
    protected string ControlPath {get { return "path1/"; }}
    protected string ControlPath2 {get {return "path2/"; }}
    protected string Content {get {return "somecontent"; }}
    protected string ControlPath3 {get {return "path3/"; }}
    

    那么您可以按如下方式使用它们:

    <div id="ViewDiscovery_<%= ModuleId %>" ></div>
    <script type="text/javascript" src="<%= ControlPath %>carousel-jquery.js"></script>
    <script type="text/javascript" src="<%= ControlPath2 %>discovery-widget.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            var myData = <%= Content %>;
            var myDiscovery = discovery('<%= ControlPath3 %>');
            myDiscovery.json(myData);
            myDiscovery.init("ViewDiscovery_<%= ModuleId2 %>");
        });
    </script>
    

    应该生成以下 HTML:

    <div id="ViewDiscovery_1" ></div>
    <script type="text/javascript" src="path1/carousel-jquery.js"></script>
    <script type="text/javascript" src="path2/discovery-widget.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            var myData = somecontent;
            var myDiscovery = discovery('path3/');
            myDiscovery.json(myData);
            myDiscovery.init("ViewDiscovery_2");
        });
    </script>
    

    【讨论】:

    • 这是我尝试的第一件事。没爱。请参阅我的原始帖子。
    • 那么当您查看页面的 Html 时,那些占位符没有被填充?您提到的类类型 - “ASP.viewdiscovery_ascx”是由 asp.net 生成的,它不应该破坏任何东西。 (如果需要,您可以覆盖它。)
    • 我已经更新了我的答案以显示我运行它时生成的 HTML。
    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多