2013-07-02 9 views
12

Ho appena iniziato a lavorare in MVC e ho un dubbio.Scopo dei metodi pubblici NonAction in MVC

Invece del metodo Nonaction, possiamo creare un metodo privato nel controller oppure possiamo anche scrivere il metodo nel modello e chiamarlo dal controller.

Quindi, qual è il vero scopo di utilizzare il metodo pubblico NonAction in MVC?

+0

Non sei sicuro di quello che stai cercando - se hai un metodo che deve essere pubblico per qualche motivo ma non dovrebbe essere un'azione, lo segnalo in questo modo ... Oppure la tua domanda è "perché le persone usano metodi pubblici"? –

+1

@AlexeiLevenkov: Sì, la mia domanda è: perché le persone usano il metodo public nonaction. possono persino usare il metodo privato. – ChandniShah

risposta

6

(ho ristrutturato la risposta di affrontare meglio le domande nei commenti)

penso, l'attributo è qui solo per una migliore flessibilità. Come progettista di framework, si vuole rilassare il più possibile i limiti di codifica degli utenti finali. Il requisito di non avere non-azioni pubbliche può suonare "in generale", ma potrebbe essere troppo restrittivo per alcuni progetti.L'aggiunta di [NonAction] risolve il problema (introdotto dal loro cattivo design) - e ovviamente non sei obbligato a usare l'attributo, quindi è un win-win dal punto di vista del progettista di framework.

Un altro motivo può essere legacy - nelle versioni MVC precedenti solo i metodi contrassegnati con [Action] dove considerati come azioni. Quindi, quando hanno allentato il requisito (e tutti i metodi pubblici sono stati trattati come azioni) hanno mantenuto [NonAction] in modo che gli sviluppatori non si confondessero troppo.


In generale, utilizzando NonAction è una cattiva pratica - esattamente per le ragioni che lei ha affermato. Se qualcosa non dovrebbe essere un'azione, non dovrebbe essere public in primo luogo.

problema con metodi non-azione pubblica sul controller è che fanno le persone tentati per istanziare il controller e chiamare il metodo, invece di separare la logica comune:

Confronta

public class MyController : IController 
{ 
    public ActionResult Foo(long orderId) 
    { 
     var order = new OrdersController().GetOrder(orderId); //GetOrder is public 
     ... 
    } 
} 

con

Il primo approccio porta ad un aumento dell'accoppiamento tra controllori e codice non semplice nelle azioni. Il codice diventa difficile da seguire e refactoring e scomodo da simulare/testare.

Oltre all'accoppiamento aumentato, qualsiasi metodo di non azione pubblico è un buco di sicurezza - se si dimentica di contrassegnarlo con [NonAction] (o, meglio, di allontanarsi dal pubblico) - perché viene trattato come azione normale e può essere richiamato esternamente. So che la domanda originale ti suggerisce che sicuramente non dimenticherai mai di allegare l'attributo, se necessario, ma è anche importante capire cosa può succedere se vuoi;) Oh beh, e visto che ci siamo, mi sembra che "dimenticare l'attributo" è più teoricamente probabile, rispetto al "dimenticare di rendere il metodo privato".


volte la gente dice che ha public non-azioni è necessario per unit test, ma ancora una volta, quando qualcosa non è un'azione molto probabilmente può essere isolato in una classe separata e testato separatamente. Inoltre, pari a anche se non è fattibile per qualsiasi motivo, contrassegnare un metodo publica scopo di prova solo è una cattiva abitudine - utilizzando internal e InternalsVisibleTo è il modo consigliato.

+0

Buono per raccomandarlo privato anziché come metodo non di azione, in quanto può essere utilizzato in operazioni intermedie di metodi di azione come la funzione di chiamata. Ora, non possono essere chiamati fuori dal controller. Fin qui molto bene. Domanda - Perché dovrei usare il metodo 'Non-Azione'? Per favore, puoi dire il significato del suo utilizzo? –

+0

_ "Perché dovrei usare' [NonAction] '" _ - Non devi usarlo. La mia opinione è che l'attributo esiste perché chi ha creato ASP.NET MVC voleva rendere disponibile il framework anche per progetti mal progettati. – andreister

+0

ok Grazie. Ma quali sono le cattive abitudini incluse durante l'uso del metodo 'Non Action'? –

1

Questo tipo di situazione può essere causato dai requisiti di alcune strutture di test, come ad esempio è necessario eseguire il test dell'unità su quel metodo, quindi è necessario esporlo, anche se è un cattivo progetto ma non può modificarlo.

Per impostazione predefinita, il framework MVC tratta tutti i metodi pubblici di una classe controller come metodi di azione. Se la classe del controller contiene un metodo pubblico e non si desidera che sia un metodo di azione, è necessario contrassegnare tale metodo con l'attributo NonActionAttribute.

scopo reale da utilizzare non-azione pubblica

Per limitare l'accesso al metodo non-azione per notificare framework MVC che, dato il metodo di controllo non è azione.

Quando si tenta di eseguire un metodo con l'attributo NonAction tramite URL, si ottiene l'errore 404 come risposta alla richiesta.

Rif: http://msdn.microsoft.com/en-us/library/dd410269%28v=vs.90%29.aspx

per ingrandire: http://weblogs.asp.net/gunnarpeipman/archive/2011/04/09/asp-net-mvc-using-nonactionattribute-to-restrict-access-to-public-methods-of-controller.aspx

+1

So come usare NonActionAttribute. La mia vera domanda è quale sia una vera ragione per usare il metodo Nonaction. – ChandniShah

+0

@ChandniShah, Quando si tenta di eseguire un metodo con attributo 'NonAction' su URL si ottiene l'errore 404 come risposta alla richiesta. – Satpal

+0

Ma al posto del metodo public non action, posso anche usare il metodo privato. anche in questo caso riceverò l'errore. quindi perché ho bisogno di usare il metodo puble non d'azione? – ChandniShah

0

Questo è vantaggioso quando l'URL non sono case sensitive. In modo che, per esempio, se si ha la richiesta di Home/Chi questo va a HomeController e Chi azione, così come Home/Chi sta andando allo stesso controller e lo stesso metodo di azione.

come di seguito

public class HomeController:Controller 
{ 
.... 
    public ViewResult About() 
    { 
     return View(); 
    } 

    public ViewResult aBOut() 
    { 
     return View(); 
    } 
} 

Il quadro non può determinare quale about funzione da chiamare, e getta l'eccezione dicendo che la chiamata è ambigua.

enter image description here

Naturalmente un modo per risolvere questo problema è quello di cambiare il nome dell'azione.

Se per qualche motivo non si desidera modificare il nome dell'azione e una di queste funzioni non è un'azione, è possibile decorare questo metodo non di azione con l'attributo NonAction. Esempio:

[NonAction] 
public ActionResult aBOut() 
{ 
    return View(); 
} 
0

Utilizziamo i controller come driver di collegamento con pipeline ASP personalizzata, ogni driver è responsabile del rendering di una sezione (vista parziale) della pagina dei risultati. Poi stiamo usando metodi pubblici come:

[NonAction] 
publi int GetOrder() 

per risolvere sezioni ordinare a pagina o altro per risolvere l'autorizzazione per l'utente corrente (ad esempio, se la sezione corrente è modificabile o semplicemente di sola lettura).

Quindi non dovresti limitarti a pensare a Controller come solo un modo per gestire le richieste ma anche come strumento per costruire il tuo framework personalizzato per la pagina di rendering. In questo modo manteniamo responsabili i nostri Controllori per esattamente un compito e separiamo le preoccupazioni relative al dominio.

0

Per impostazione predefinita, il framework MVC tratta tutti i metodi pubblici di una classe controller come metodi di azione.Se la classe del controller contiene un metodo pubblico e non si desidera che sia un metodo di azione, è necessario contrassegnare tale metodo con l'attributo NonActionAttribute.

+0

Quindi, qual è il vantaggio dell'utilizzo di Non azione nel controller? –

+0

È possibile utilizzare i metodi non di azione per le richieste con esecuzione prolungata e senza CPU. Ciò evita il blocco del server Web durante l'esecuzione del lavoro durante l'elaborazione della richiesta. – Duk

0

ASP.NET è altamente personalizzabile. Supponiamo di voler cambiare il comportamento predefinito del framework sovrascrivendo il gestore HTTP MVC. Forse si desidera personalizzare la logica di registrazione in base al controller, che viene utilizzato. Alcuni controller implementano l'interfaccia ILoggingController con il metodo IControllerLogger GetLogger(). Per questo metodo è necessario scrivere un metodo pubblico non di azione.

Problemi correlati