【问题标题】:How to express directives as C# so they can be conditional如何将指令表示为 C#,以便它们可以是有条件的
【发布时间】:2017-07-27 00:06:06
【问题描述】:

此标记支持未在我正在处理的页面的移动版本中呈现的代码。

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<%@ Register TagPrefix="ComponentArt" Namespace="ComponentArt.Web.UI" Assembly="ComponentArt.Web.UI" %>
<%@ Register Src="Cart.ascx" TagName="Cart" TagPrefix="uc1" %>
<%@ Register Src="Search.ascx" TagName="Search" TagPrefix="uc5" %>
<%@ Register Src="Credits.ascx" TagName="Credits" TagPrefix="uc6" %>
<%@ Register Src="Menu.ascx" TagName="Menu" TagPrefix="uc3" %>
<%@ Register Src="taskspanel.ascx" TagName="TasksPanel" TagPrefix="uc6" %>

毫不奇怪,加载了很多不必要的脚本。这很糟糕。

如果有使这些注册有条件的标记,请参考我的文档。否则,我目前的想法是使用与标记等效的显式代码,并以这种方式使其有条件。

我从this rather old resource 发现了 ScriptManager,但上面的标记没有明确引用 js 文件,所以我不知道如何在两者之间进行映射。谁能给点建议?

尝试在下面使用 superjos 的响应,我修改了我的页面以引用 Page.Mobile,这是一个方便的布尔属性:

<%@ Page Language="C#" AutoEventWireup="false" EnableViewStateMac="false" CodeBehind="Forms.aspx.cs" Inherits="ASSAOHS.forms" %>
<%@ if (!Mobile) { %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<%@ Register TagPrefix="ComponentArt" Namespace="ComponentArt.Web.UI" Assembly="ComponentArt.Web.UI" %>
<%@ Register Src="Cart.ascx" TagName="Cart" TagPrefix="uc1" %>
<%@ Register Src="Search.ascx" TagName="Search" TagPrefix="uc5" %>
<%@ Register Src="Credits.ascx" TagName="Credits" TagPrefix="uc6" %>
<%@ Register Src="Menu.ascx" TagName="Menu" TagPrefix="uc3" %>
<%@ Register Src="taskspanel.ascx" TagName="TasksPanel" TagPrefix="uc6" %>
<%@ } %>

但这会产生Parser Error Message: The server block is not well formed.

这样写

<%@ Page Language="C#" AutoEventWireup="false" EnableViewStateMac="false" CodeBehind="Forms.aspx.cs" Inherits="ASSAOHS.forms" %>
@if (!Mobile) {
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<%@ Register TagPrefix="ComponentArt" Namespace="ComponentArt.Web.UI" Assembly="ComponentArt.Web.UI" %>
<%@ Register Src="Cart.ascx" TagName="Cart" TagPrefix="uc1" %>
...
}

不会产生错误但不会被处理; if 语句和大括号只是简单地通过并在浏览器中呈现为文本。

这让我选择了第二个选项,将指令映射到使用 ScriptManager 注册内容的显式代码。有接盘侠吗?


感谢 Pedro 提供的帮助,但该参考对如何将这些控制指令表示为代码没有帮助。

看起来我可能需要使用选项三,它重定向到另一个不包含指令的页面。

【问题讨论】:

  • 您可以尝试this 代码隐藏方法。

标签: c# asp.net scriptmanager


【解决方案1】:

你试过this SO answer吗?基本上是通过在 C# 代码中有条件地取一个真/假值来获得一些值:

public bool IsDebugBuild 
{ 
    get
    {
        #if DEBUG
        return true;
        #else
        return false;
        #endif
    }
}

然后只使用代码中的那个位作为 Razor 中的@if 条件,而将所有其余部分保留在 Razor 中?

Another answer 也是这么说的。

免责声明:我没有尝试过这个,而且我已经很久没有使用&lt;%@ Register&gt; 指令了。

【讨论】:

  • 我已经有了你建议的形式的标志,我正准备尝试你的答案。感谢您弥补我对 Razor 语法的无知。
  • 我只是不确定它是否适用于 Register 指令。如果是 Razor 语法问题,请尝试四处寻找 Razor if then else,例如here
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 2014-02-13
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2019-06-20
相关资源
最近更新 更多