Domanda

Ho bisogno di creare qualcosa di simile a come MVC invoca un Metodo(Azione) e utilizza anche il Modello del Raccoglitore per mappare un NamedValueCollection per i parametri del metodo.Fondamentalmente ho un Controller di azioni che è necessario in modo dinamico chiamata di un metodo in una classe, il controller dispone di tutte le informazioni inviate in una forma o stringa di query più il nome del metodo da invocare come una stringa.

Per quanto mi riguarda è lo stesso di richiamare un'azione.Io sono essenzialmente passando giù un altro livello (c'è una buona ragione per cui io non sono questi i metodi del controller btw).

Ho scaricato il ASP.Net MVC 1.0 Source, ma ci sono un sacco di classi, sto avendo difficoltà a trovare il codice che gestisce questo.

So come richiamare un metodo il cui nome è contenuto in una stringa, ma forse c'è un modo migliore che MVC utilizza.Ho anche bisogno di sapere come utilizzare i Raccoglitori di Modello per effettuare la Richiesta.Forma + Stringhe di Query che metodi di parametri.

Se qualcuno potesse indicarmi a il codice nel pattern MVC fonte che fa questo o mi punto nella giusta direzione per quanto riguarda utilizzando il Modello di default di Legante MVC manualmente sarei grato.

Fammi sapere se posso fare questo più chiaro.

Grazie

È stato utile?

Soluzione

È complicato.FindAction è chiamato ControllerActionInvoker.Ciò richiede, infine, ReflectedControllerDescriptor.FindAction, che a sua volta chiama ActionMethodSelector.FindActionMethod, che chiama RunSelectionFilters sullo stesso tipo.Tale metodo prende una lista di metodi passato dal collare, e scorre loro, esaminando le argomentazioni di ogni metodo e la loro comparazione con i valori nella richiesta.Perché questo deve correre velocemente su una richiesta, questo è nella cache, e perché è stato progettato per essere estensibile, ci sono alcuni tipi astratti tra gli strati che ho descritto.Quindi, può essere un po ' difficile da seguire in un primo momento, e probabilmente sarebbe difficile da riutilizzare per i non-logica di controllo.Tuttavia, si potrebbe utilizzare come un modello per l'implementazione del proprio sistema.Mi sembra un po ' troppo complicato per un dominio specifico di applicazione.Il numero di punti di estensione è probabilmente appropriato per il framework MVC, ma il proprio codice, YAGNI.

Spero che questo ti dà abbastanza per iniziare, tuttavia.

Per quanto riguarda utilizzando un modello del raccoglitore senza il web stack:Beh, hai ancora bisogno di MVC, ma non necessariamente un server web.Ecco come farlo in una unità di test:

    internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:BaseTimeRecordPresentationModel
    {
        var mbc = new ModelBindingContext()
        {
            ModelName = prefix,
            ModelState = modelState,
            ModelType = typeof(T),
            ValueProvider = collection.ToValueProvider()
        };
        IModelBinder binder = new TimeRecordModelBinder();
        var cc = new ControllerContext();

        return binder.BindModel(cc, mbc) as T;
    }

    internal static T BindAndAssertValid<T>(string prefix, FormCollection collection) where T:BaseTimeRecordPresentationModel
    {
        var msd = new ModelStateDictionary();
        var result = Bind<T>(prefix, collection, msd);
        if (!msd.IsValid)
        {
            Assert.Fail(ModelStateValidationSummary(msd));
        }
        return result;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top