动态内容的最佳实践

时间:2013-05-23 19:52:27

标签: c# asp.net

我有一个相当广泛的经典ASP背景(使用服务器端javascript),我的公司终于(最终)推动重新编码ASP.Net中的所有内容(使用C#)。我对Classic ASP中的良好编程习惯有很好的把握,我通常会尝试确保以“正确”的方式编写代码。我一直在阅读ASP.Net教程,感觉我对基础知识非常了解。我很好地将客户端javascript分成外部js文件,在外部css文件中保留样式以外的样式等等。因此,在阅读这些新手教程时,我理解代码隐藏页面的概念。将c#代码与最终成为页面标记的代码分开是有意义的。制作< asp:按钮>对象和改变它们的代码隐藏规则非常有意义。

然而,我很难绕过如何做一些简单的事情,就像我在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>对象并相应地在代码隐藏页面中设置它 - 但在上面的示例中,如果条件为真,我只显示按钮,如果为假,则为span块。

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

在我看来,对于您的标记和代码隐藏页面也是如此。只是混合2只是一种必要的邪恶,还是有更好的方式去做我上面展示的东西?

6 个答案:

答案 0 :(得分: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) { .. }以确保它只运行一次。

答案 1 :(得分: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中的输入。如果它等于“显示按钮”,则第二个按钮将变为可见。如果文本是其他内容,则不会显示该按钮,并且标签会显示您不允许看到该按钮。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除非你有充分理由不这样做,否则请使用Visible property。 (在ASP.NET Web窗体中,如果您使用转发器控件动态更改组件树的结构,则会遇到麻烦。)我所做的是:

Page.aspx

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

Page.aspx.cs

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

(我的偏好是制作控件以从代码隐藏中“拉”数据,而不是将其推送到那里,并在可能的情况下使用匿名和纯HTML控件覆盖其较重的等价物。)以前设置Visible的任何方式页面渲染将工作。

答案 4 :(得分: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;
        }    
    }
}

答案 5 :(得分:0)

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

我这样说是因为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>

   }

要回答你的问题,我会禁用服务器端的按钮。在客户端有一个残疾人。如果禁用该按钮,请使用适当的文本启用Label。

//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" />