したがって、私はしばらくの間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")を使用してファイルのアップロードを処理することもできます。
だから私の質問は、この方法の問題と、その有用性についての考えを見ることができますか?
私のブログ の詳細とテストがあります。
私が見る問題: