web-dev-qa-db-ja.com

ASP.NETからWebFormsへの代替開発方法-これに問題はありますか?

したがって、私はしばらくの間ASP.NET Webフォームで開発してきましたが、すべてのオーバーヘッド(ViewStateとそれが生成するすべてのJavaScriptなど)、およびWebフォームがHTML生成の多くを引き継ぐ方法に悩まされることがよくあります。

時々、マークアップを完全に制御して自分の効率的なHTMLを生成したいだけなので、HtmlFormsと呼んでいるものを試しています。

基本的に、これはASP.NET Webフォームを使用していますが、フォームrunat="server"タグはありません。このタグがないと、ASP.NETはページに何も追加しないようです。いくつかの基本的なテストから、それはうまく動作しているように見え、コードビハインドページや、リピーターなどの多くのASP.NETコントロールを使用する機能がまだあります。

もちろん、runat="server"という形式がないと、多くのコントロールが機能しません。 Enterprise Software Development の投稿には、タグを必要とするコントロールがリストされています。

そのリストから、TextBoxes、DropDownLists、RadioButtonsなどのすべてのフォーム要素を使用できないことがわかります。代わりに、通常のHTMLフォームコントロールを使用します。しかし、背後のコードからこれらのHTMLコントロールにどのようにアクセスしますか?

ポストバックでの値の取得は簡単で、Request.QueryStringまたはRequest.Formを使用するだけです。

ただし、データをコントロールに渡すのは少し面倒です。値フィールドでASP.NET Literalコントロールを使用しますか、またはマークアップページで<%= value %>を使用しますか? HTMLコントロールにrunat="server"を追加することをお勧めします。これにより、コードビハインドで次のようにコントロールにアクセスできます。((HtmlInputText)txtName).Value = "blah";

以下は、テキストボックスとドロップダウンリストで何ができるかを示す例です。

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="NoForm.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
</head>
<body>
    <form action="" method="post">
        <label for="txtName">Name:</label>
        <input id="txtName" name="txtName" runat="server" /><br />
        <label for="ddlState">State:</label>
        <select id="ddlState" name="ddlState" runat="server">
            <option value=""></option>
        </select><br />
        <input type="submit" value="Submit" />
    </form>
</body>
</html>

Default.aspx.cs

using System;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
namespace NoForm
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Default values
            string name = string.Empty;
            string state = string.Empty;
            if (Request.RequestType == "POST")
            {
                //If form submitted (post back)
                name = Request.Form["txtName"];
                state = Request.Form["ddlState"];
                //Server side form validation would go here
                //and actions to process form and redirect
            }
            ((HtmlInputText)txtName).Value = name;
            ((HtmlSelect)ddlState).Items.Add(new ListItem("ACT"));
            ((HtmlSelect)ddlState).Items.Add(new ListItem("NSW"));
            ((HtmlSelect)ddlState).Items.Add(new ListItem("NT"));
            ((HtmlSelect)ddlState).Items.Add(new ListItem("QLD"));
            ((HtmlSelect)ddlState).Items.Add(new ListItem("SA"));
            ((HtmlSelect)ddlState).Items.Add(new ListItem("TAS"));
            ((HtmlSelect)ddlState).Items.Add(new ListItem("VIC"));
            ((HtmlSelect)ddlState).Items.Add(new ListItem("WA"));
            if (((HtmlSelect)ddlState).Items.FindByValue(state) != null)
                ((HtmlSelect)ddlState).Value = state;
        }
    }
}

ご覧のとおり、ASP.NETサーバーコントロールと同様の機能を備えていますが、最終的なマークアップをより詳細に制御でき、ViewStateやすべてのJavaScript ASP.NETが追加するようなオーバーヘッドが少なくなっています。

興味深いことに、HttpPostedFileを使用して、独自の入力type = "file"コントロール(および必要なフォームenctype = "multipart/form-data")を使用してファイルのアップロードを処理することもできます。

だから私の質問は、この方法の問題と、その有用性についての考えを見ることができますか?

私のブログ の詳細とテストがあります。

3
johna

私が見る問題:

  • 非標準的な作業方法:独自の、かなり非標準的な作業方法を考えています。あなたが雇う新しい開発者はあなたのフレームワークの詳細を学ぶ必要があります。それらのいくつかはそれを好まないかもしれません(例えば、上記のコメントのいくつかを参照してください)、そしてそれで働くことを拒否します。進むにつれて、データバインディングなどの基本的な機能の多くを(再)発明し続けることになりますが、これは基本的にはあなたの努力の無駄です。
  • テクノロジーの強みを使用していない:WebFormsは、イベント駆動型プログラミングをWebにもたらす試みです。これをデフォルトで有効にするには、常に多くの状態を渡す必要があります。これを回避することにより、Webフォームの機能と利点のほとんどを失うことになります。
  • すでにこれを実行している既存のテクノロジー:あなたがしようとしていることを実行する優れたテクノロジーがありますが、はるかに良い方法です。 ASP.Net MVCはおそらく最もよく知られています。 Webが実際に機能する方法に近いスタイルで開発したい場合(およびそのためのフレームワークが必要な場合)、それを試してください。それは本当に優れた技術であり、WebFormsと比較すると少し新鮮です。
9
Daniel B