3

私は (サーバー側の JavaScript を使用して) かなり広範なクラシック ASP のバックグラウンドを持っており、私の会社は最終的に (最終的に) ASP.Net (C# を使用) ですべてを再コーディングする方向に進んでいます。私は、Classic 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>オブジェクトを作成し、それに応じてコード ビハインド ページでスタイルを設定しますが、上記の例では、条件が true の場合にのみボタンを表示し、true の場合にスパン ブロックを表示しています。間違い。

コード ビハインド ページにすべての C# コードを配置する必要がないことはわかっています。<% %>タグは、Classic ASP と同じように使用できます。しかし、そうすると、コード ビハインド ページの関連性が低下するように思えます。たとえば、外部の CSS スタイルシートを使用してページのスタイルを設定し、同時に個々のタグでインライン スタイルを使用できることを私は知っています。しかし、これは悪い習慣だと思います。その要素に影響を与える関連スタイルを見つけるために、マークアップと css ファイルのどちらを調べればよいかわからない場合、後でその要素のスタイルを調整する必要がなくなります。

マークアップとコード ビハインド ページについても同じことが言えると思います。2つを混ぜなければならないのは必要悪ですか、それとも私が上で示していることを行うためのより良い方法はありますか?

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 イベント)。これを起動時に 1 回だけ実行する必要がある場合は、必ず 1if (!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.";

            }
        }

これは基本的に textbox の入力をチェックしますtxtCondition。「ボタンを表示」と等しい場合、2 番目のボタンが表示されます。テキストがそれ以外の場合、ボタンは表示されず、ボタンの表示が許可されていないというラベルが表示されます。

于 2013-05-23T20:05:39.780 に答える
0

問題は、ASP.NET Web フォームと ASP.Net MVC の使用に関するものではありません。あなたのシナリオでは、ASP.NET Web フォームよりも ASP.NET MVC を使用する方が有益である可能性があることを指摘しなければならないと感じました。

これは、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 に答える
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
    }
}

関数呼び出しを伴う 2 番目のケース

<%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>

1 つを使用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

正当な理由がない限り、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>

Page.aspx.cs

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

(私の好みは、コード ビハインドからデータをプッシュするのではなく「プル」するコントロールを作成し、可能な場合は、より重い同等のコントロールに対して匿名でプレーンな HTML コントロールを使用することです。)Visibleページがレンダリングされる前に設定する方法はどれでも機能します。

于 2013-05-23T20:02:18.067 に答える