Modo alternativo di sviluppo per ASP.NET in WebForms - Problemi con questo?

3

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 .

    
posta johna 19.09.2012 - 03:26
fonte

1 risposta

9

I problemi che vedo:

  • Modalità di lavoro non standard : ti viene in mente il tuo modo di lavorare piuttosto non standard. Tutti i nuovi sviluppatori che assumerai dovranno imparare i dettagli del tuo framework. Ad alcuni potrebbe non piacere (ad esempio vedere alcuni dei commenti sopra) e rifiutarsi di lavorarci. Man mano che procedi, continuerai a (ri) inventare molte funzionalità di base, come l'associazione dei dati, che è essenzialmente uno spreco dei tuoi sforzi.
  • Non utilizzare i punti di forza della tecnologia : i WebForms sono un tentativo di portare sul web la programmazione basata sugli eventi. Per abilitarlo di default, un sacco di stato deve essere passato in giro tutto il tempo. Lavorando in questo modo, stai perdendo la maggior parte delle funzionalità e dei vantaggi di WebForms.
  • Tecnologie esistenti che lo fanno già : esistono eccellenti tecnologie che fanno ciò che stai cercando di fare, ma in un modo molto migliore. ASP.Net MVC è probabilmente il più noto. Se ti piacerebbe sviluppare uno stile più vicino al modo in cui il web funziona (e vorrebbe un framework che aiuti in questo), provalo. È davvero una tecnologia eccellente, un po 'di aria fresca rispetto a WebForms.
risposta data 19.09.2012 - 08:26
fonte

Leggi altre domande sui tag