3

我有相当广泛的经典 ASP 背景(使用服务器端 javascript),我的公司终于(最终)推动在 ASP.Net 中重新编码所有内容(使用 C#)。我很好地掌握了经典 ASP 中的良好编程实践,并且我通常会尝试确保以“正确”的方式编写代码。我一直在阅读 ASP.Net 教程,感觉自己对基础知识有了相当的了解。在将客户端 javascript 分离为外部 js 文件、将样式保持在外部 css 文件中的标记之外等方面,我有很好的纪律。因此,在阅读这些新手教程时,我了解代码隐藏页面的概念。将 c# 代码与最终成为页面标记的内容分开对我来说是有意义的。制作<asp:button>

但是,我很难思考如何做一些简单的事情,就像我在 Classic ASP 中所做的那样:

<%
   if (condition) {
      %>
         <input type="button" value="click me" onclick="dosomething()" />
      <%
   }
   else {
      %>
         <span>You don't have permission to see the button</span>
      <%
   }
%>

我很难弄清楚我应该如何将您在上面看到的条件内容放入代码隐藏页面中。如果我在这两种情况下都显示一个按钮,我会<asp:button>在代码隐藏页面中创建一个对象并相应地设置它的样式 - 但在上面的示例中,我只在条件为真时显示按钮,如果是跨度块错误的。

我知道您不必将所有 c# 代码都放在代码隐藏页面中。我可以<% %>像在 Classic ASP 中那样使用标签。但是,如果我这样做,那么在我看来,它会降低代码隐藏页面的相关性。例如,我知道您可以使用外部 css 样式表来样式化您的页面,同时也可以在单个标签上使用内联样式。然而,我认为这是不好的做法。如果您不知道是在标记中还是在 css 文件中查找影响该元素的相关样式,则以后必须调整该元素上的样式会很困难。

在我看来,您的标记和代码隐藏页面也是如此。将两者混合在一起是否只是一种必要的邪恶,还是有更好的方法来做我上面展示的事情?

4

6 回答 6

2

您可以在标记中包含:

<asp:Button .. Visible="False" />
<asp:Label .. Text="You do not have permissions" Visible="False" />

注意 Visible 属性。ASP.NET Web 表单建立在对象模型的思想之上,因此按钮和标签是您可以使用的对象。在后面的代码中,您可以拥有:

protected void Page_Load(object sender, EventArgs e) {
    .
    .

    if (Xcondition = true) {
       Button1.visible=  true;
       Label2.Visible = false;
    }
    else {
       Button1.visible=  false;
       Label2.Visible = true;
    }
}

是实现这一点的传统方式。您只需要弄清楚您需要在生命周期中的哪个位置执行此操作,因为负载可能不是最好的(例如 Init 或 PreRender 事件)。如果您只需要在启动时执行一次,请if (!Page.IsPostBack) { .. }确保它只运行一次。

于 2013-05-23T19:57:10.713 回答
1

我做了一个小例子,你基本上可以复制/粘贴并弄乱一点。

这是aspx代码:

 < body>
    <form id="form1" runat="server">
    <div>

        <asp:TextBox runat="server" ID="txtCondition"></asp:TextBox>
        <asp:Button runat="server" Text="Check condition" ID="btnCheckCondition" OnClick="btnCheckCondition_Click" />

        <asp:Button runat="server" Text="Click me" ID="btnSubmit" OnClick="btnSubmit_Click" Visible="false"/>
        <asp:Label runat="server"  ID="lblMsg"></asp:Label>

    </div>
    </form>
</body>

这是后面的代码:(如果您双击 btnCheckCondition,click_event 方法将在您的代码隐藏中自动生成。

  protected void btnCheckCondition_Click(object sender, EventArgs e)
        {
            if (txtCondition.Text == "Show the button")
            {
                btnSubmit.Visible = true;
                lblMsg.Text = "You are allowed to see the button.";

            }
            else
            {
                lblMsg.Text = "You are NOT allowed to see the button.";

            }
        }

这基本上会检查文本框中的输入txtCondition。如果它等于“显示按钮”,则第二个按钮将变得可见。如果文本是其他内容,则不会出现该按钮,并且会显示一个标签,说明您不允许看到该按钮。

于 2013-05-23T20:05:39.780 回答
0

除非您有充分的理由不这样做,否则请使用该Visible属性。(在 ASP.NET Web 窗体中,如果您动态更改组件树的结构而不是使用中继器控件,那么您就是在自找麻烦。)我要做的是:

页面.aspx

<button type='button' Visible='<%# condition %>' runat='server'>
    Click Me!
</button>
<span Visible='<%# !condition %>' runat='server'>
    No button for you!
</span>

页面.aspx.cs

protected void Page_Load() {
    if (!IsPostBack) DataBind(); // evaluates <%# ... %> expressions
}

(我的偏好是让控件从代码隐藏中“拉取”数据,而不是将其推到那里,并尽可能使用匿名和纯 HTML 控件而不是更重的等价物。)Visible在页面呈现之前进行任何设置都可以。

于 2013-05-23T20:02:18.067 回答
0

首先以简单的方式帮助您,为了能够condition被识别,您需要定义它并在后面的代码中公开它。例如:

<%if (condition) {%>
    <input type="button" value="click me" onclick="dosomething()" />
<%}else { %>
    <span>You don't have permission to see the button</span>
<% } %>    

和后面的代码

public partial class OnePage : System.Web.UI.Page
{
    public bool condition = false;

    protected void Page_Load(object sender, EventArgs e)
    {
        // here change the condition
    }
}

函数调用的第二种情况

<%if (fCheckAuth()) {%>
    <input type="button" value="click me" onclick="dosomething()" />
<%}else { %>
    <span>You don't have permission to see the button</span>
<% } %>    

和后面的代码

public partial class OnePage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    public bool fCheckAuth()
    {
        // return your evaluate
        return false;
    }    
}

更多asp.net表单样式

现在,使用新的 asp.net(与经典的 asp 相比)您也可以这样做(并且与此类似)。

<asp:Panel runat="server" ID="pnlShowA">
    <input type="button" value="click me" onclick="dosomething()" />
</asp:Panel>

<asp:Panel runat="server" ID="pnlShowB">
    <span>You don't have permission to see the button</span>
</asp:Panel>

使用一个asp:Panel来扭曲你的全部内容,并在你后面的代码上打开它并关闭它。

public partial class OnePage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (condition)
        {
            pnlShowA.Visible = true;
            pnlShowB.Visible = false;
        }
        else
        {
            pnlShowA.Visible = false;
            pnlShowB.Visible = true;
        }    
    }
}
于 2013-05-23T21:12:29.693 回答
0

在页面中有一个标签和一个按钮。从后面的代码中检查条件并根据条件隐藏或显示控件。您可以使用控件的可见性属性来隐藏或显示它们。还可以使用 asp.net 控件,以便您可以从后面的代码中访问它们。

于 2013-05-23T19:56:31.897 回答
0

虽然问题不在于使用 ASP.NET Web Forms 与 ASP.Net MVC。我不得不指出,在您的场景中使用 ASP.NET MVC 而不是 ASP.NET Web 窗体可能更有益。

我这样说是因为 Classic ASP 和 ASP.NET MVC 内联样式相似。在大多数情况下,您可以将 ASP ( <% %>) 转换为 Razor(一种使用 HTML 内联服务器端代码的不同风格),只需对下划线逻辑进行少量修改。我不了解你,但我必须编写的代码越少越好。例如,您上面的代码将转换为以下 Razor 语法:

   @if (condition) {

         <input type="button" value="click me" onclick="dosomething()" />

   }
   else {

         <span>You don't have permission to see the button</span>

   }

为了回答您的问题,我将禁用服务器端的按钮。在客户端上有一个禁用。如果按钮被禁用,请使用适当的文本启用标签。

//Code-behind
   bool correctPermission = true;

   submit.Enabled = correctPermission;
   noPermissionMessage.Enabled = !correctPermission;

//Client Code


<asp:Button ID="submit" runat="server" Text="Click Me" />
<asp:Label ID="noPermissionMessage" runat="server" Text="You don't have permission to see the button" Enabled="false" />
于 2013-05-23T21:48:45.480 回答