Quindi mi sono sviluppato in WebForms ASP.NET da un po 'di tempo ma spesso mi infastidisco di tutto il sovraccarico (come ViewState e tutto il codice JavaScript che genera), e del modo in cui WebForms acquisisce un sacco di generazione HTML.
A volte voglio solo avere il pieno controllo del markup e produrre un HTML efficiente per conto mio, quindi ho sperimentato ciò che mi piace chiamare HtmlForms .
In sostanza, si sta utilizzando i WebForm di ASP.NET ma senza il tag runat="server"
. Senza questo tag, ASP.NET sembra non aggiungere nulla alla pagina. Da alcuni test di base sembra che funzioni bene e tu abbia ancora la possibilità di utilizzare le pagine code-behind e molti controlli ASP.NET come i ripetitori.
Ovviamente senza la forma runat="server"
molti controlli non funzioneranno. Un post su Sviluppo di software aziendale elenca i controlli che richiedono il tag.
Da quella lista vedrai che tutti gli elementi del modulo come TextBoxes, DropDownLists, RadioButtons, etc non possono essere usati. Invece si usano i normali controlli dei moduli HTML. Ma come accedi a questi controlli HTML dal codice sottostante?
Recuperare i valori sul postback è facile, basta usare Request.QueryString
o Request.Form
.
Ma passare i dati al controllo potrebbe essere un po 'disordinato. Usi un controllo letterale ASP.NET nel campo del valore o usi <%= value %>
nella pagina di markup? Ho trovato utile aggiungere runat="server"
ai miei controlli HTML e quindi puoi accedere al controllo nel tuo code-behind in questo modo: ((HtmlInputText)txtName).Value = "blah"
;
Ecco un esempio che mostra cosa puoi fare con una casella di testo e un elenco a discesa:
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;
}
}
}
Come puoi vedere, hai una funzionalità simile ai controlli server ASP.NET ma più controllo sul markup finale e meno overhead come ViewState e tutti gli ASP.NET JavaScript aggiunti.
È interessante notare che è anche possibile utilizzare HttpPostedFile per gestire i caricamenti di file utilizzando il proprio tipo di input = controllo "file" (e forma necessaria enctype="multipart / form-data").
Quindi la mia domanda è: riesci a vedere qualche problema con questo metodo e qualche idea sulla sua utilità?
Ho ulteriori dettagli e test su sul mio blog .