2009-04-22 11 views
13

Lo so, lo so, lo so. Non dovrei fare webforms all'interno di MVC, sono completamente d'accordo. Ma le persone che firmano il mio stipendio non approvano una conversione completa del nostro sito a MVC in questo momento. Quindi sto prendendo passi incrementali, pagina per pagina, per convertirli mentre aggiungo nuove funzionalità in MVC.ASP.NET MVC - IsPostBack è ancora qui?

Quindi la mia domanda è: come posso accedere alla proprietà IsPostBack da un controller?

Modifica: Per chiarire ulteriormente, ho un controllo utente Webform sulla mia pagina mvc master che può avviare i postback. Sto cercando di identificare questi postback contro un post in PVC. A questo punto penso di aver appena controllato le chiavi del modulo di richiesta per una chiave "__viewstate" e se è stata trovata, la considero come un postback.

+0

'bool IsPostBack public static (questo HttpRequestBase richiesta) {return __viewstate-something-something} 'è probabilmente il più vicino che otterrai. Tuttavia, l'inserimento di controlli utente Web Form nelle pagine master MVC potrebbe interrompersi nelle versioni future di ASP.NET MVC. – bzlm

+0

Perché non dovremmo utilizzare i moduli Web all'interno di MVC? Sto usando i moduli web. Ma io non sono professionale. Cos'altro possiamo usare oltre ai moduli web? –

risposta

3

I controllori non ereditano da System.Web.UI.Page. Non esiste una proprietà isPostback.

+1

Le viste del motore di visualizzazione ASP.NET ereditano dalla pagina. –

+2

Sono corretto. Le viste fanno. I controllori no. –

0

Il framework MVC non supporta il postback e lo stato di visualizzazione classici utilizzati nei moduli Web. Quindi, no, non hai accesso a IsPostBack.

Il mio consiglio è di avere due rami: uno con il sito corrente in cui si aggiungono patch per errori noti e un altro in cui si costruisce un nuovo sito da zero. Nuove funzionalità dovrebbero essere implementate in questo. Presumo che la maggior parte del tuo codebase sia riutilizzabile nel nuovo sito.

Quando il nuovo sito è pronto, metterlo in produzione.

13

Non c'è IsPostBack - tutto è un POST o GET (o altro verbo HTTP). Puoi limitare i verbi HTTP consentiti dalla tua azione, ad esempio non vedrai mai una richiesta da un verbo non consentito utilizzando AcceptVerbsAttribute. Ad esempio, il seguente consente solo i POST.

[AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult Update(int id) 
    { 
    } 

Se avete bisogno di avere lo stesso nome dell'azione non sia GET/POST e che in realtà fanno cose diverse, è possibile dare loro firme separate o usare l'ActionNameAttribute per alias una delle azioni in modo che i metodi possono avere nomi diversi.

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult List() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List(string filter, int page, int limit) 
    { 
    } 

O

[ActionName("List")] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult ListDisplay() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List() 
    { 
    } 

EDIT: Si noti che ho aggiunto la convalida del token antiforgery alle azioni POST. Dovresti davvero usare questo a protect against cross-site scripting attacks.

+0

In realtà ci sono ancora postback quando si mescolano pagine di mvc e webform. Vedi la mia modifica sopra. – chief7

0

Perché stai cercando di ottenere quel valore da un controller? Non sono sicuro se questo ti sarà d'aiuto, ma puoi comunque utilizzare l'oggetto tradizionale Richiesta per ottenere informazioni inviate da un modulo ...

0

Non sono sicuro di aver capito correttamente la tua domanda, ma sul controller sei tu avrebbe un'azione che gestisce il GET iniziale dal browser e una seconda azione per gestire i POST.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(MyModel model) 
{...} 

public ActionResult Create() 
{...} 
0

avrei sicuramente dare un'occhiata a questo post del blog di Scott Hanselman dove mette una pagina aspx in un'applicazione MVC.

http://www.hanselman.com/blog/PlugInHybridsASPNETWebFormsAndASPMVCAndASPNETDynamicDataSideBySide.aspx

I suoi controllori non avranno accesso alla proprietà ViewState.Anche se volessi gestire il problema di __VIEWSTATE, dovresti lavorare un po 'per farlo diventare un modulo utilizzabile in un controller mvc. Buona fortuna a venire con una strategia di conversione, non importa quanto funzioni, molte persone sarebbero interessate a conoscere i problemi che dovresti affrontare nel processo.

32

Nel caso qualcuno è ancora interessato, è possibile verificare per un posto all'interno di un metodo di azione MVC in questo modo:

if (Request.HttpMethod=="POST") { 

} 
+0

Grazie per questo, questo è esattamente il modo in cui devi farlo in MVC! –

+2

EVITARE QUESTO A TUTTI I COSTI. Il codice del controller deve essere organizzato in base ai metodi. Il tuo metodo HttpGet vale a dire [HttpGet] dovrebbe essere completamente separato rispetto al tuo metodo [HttpPost]. Ci sono molte ragioni per cui la testabilità è una, la leggibilità, ecc. Vedi la risposta di tvanfosson qui sotto. –

+1

ancora utile nel 2012 +1 per quello –

0

Se si dispone di più di una forma in una pagina MVC, è possibile aggiungere una nascosta inserire nel modulo un ID significativo e testare se ha un valore. In questo modo non è necessario avere due gestori separati (uno per get e uno per post).

Così inf pagina e all'interno del modulo:

<input type="hidden" id="testForm" name="testForm" value="1"/> 

E nel controller:

if (Request.Form["testForm"] != null) 
     { 
     // ACTIONS FOR THE POSTED FORM 
     } 

Speranza che aiuta!

7

È possibile utilizzare questo pezzo di codice in Razor

@if(IsPost) 
{ 
//dosomething 
} 
else 
{ 
//do some other thing 
} 
3

Io uso spesso questo metodo (dichiarata sulla mia classe BaseController)

protected bool IsPostBack() 
{ 
    bool isPost = string.Compare(Request.HttpMethod, "POST", 
     StringComparison.CurrentCultureIgnoreCase) == 0; 
    if (Request.UrlReferrer == null) return false; 

    bool isSameUrl = string.Compare(Request.Url.AbsolutePath, 
     Request.UrlReferrer.AbsolutePath, 
     StringComparison.CurrentCultureIgnoreCase) == 0; 

    return isPost && isSameUrl; 
}