Question

Je dois créer quelque chose de similaire à la façon dont MVC invoque une méthode (action) et utilise également le modèle Binder pour mapper un NamedValueCollection aux paramètres sur cette méthode. Fondamentalement, j'avoir une action du contrôleur qui doit appeler dynamiquement une méthode d'une classe, l'unité de commande a envoyé des informations dans une chaîne de forme ou de la requête ainsi que le nom de la méthode à invoquer sous forme de chaîne.

En ce qui me concerne, il est le même que l'invocation d'une action. Je suis essentiellement le passant vers le bas un autre niveau (il y a une bonne raison pour laquelle je ne peux pas avoir ces méthodes sur le contrôleur btw).

J'ai téléchargé la source ASP.Net MVC 1.0, mais il y a un tas de classes, je suis mal à trouver le code qui gère cela.

Je sais comment appeler une méthode dont le nom est contenu dans une chaîne, mais peut-être il y a une meilleure façon que MVC utilise. Je dois aussi savoir comment utiliser le modèle Liants pour faire Request.Form + chaînes de requête pour que les paramètres de méthodes.

Si quelqu'un pouvait me pointer soit le code dans la source MVC qui fait cela ou me diriger dans la bonne direction en ce qui concerne l'utilisation par défaut Model Binder dans MVC manuellement Je vous serais reconnaissant.

Permettez-moi de savoir si je peux rendre cela plus clair.

Merci

Était-ce utile?

La solution

Il est compliqué. FindAction est appelé ControllerActionInvoker. Cela appelle, par la suite, ReflectedControllerDescriptor.FindAction, qui appelle à son tour ActionMethodSelector.FindActionMethod, qui appelle RunSelectionFilters sur le même type. Cette méthode prend une liste de méthodes lui passer par le col et les itère, en examinant les arguments sur les méthodes et les comparer avec les valeurs de la demande. Parce que cela doit fonctionner rapidement sur une requête arrive, tout cela est mis en cache, et parce qu'il est conçu pour être extensible, il y a certains types abstraits entre les couches que je viens de décrire. Par conséquent, il peut être un peu difficile à suivre au début, et il serait probablement difficile de les reformater pour la logique non-contrôleur. Cependant, vous pouvez l'utiliser comme modèle pour la mise en œuvre de votre propre système. Je pense qu'il est un peu trop compliqué pour une application spécifique à un domaine. Le nombre de points d'extension est probablement approprié pour le framework MVC, mais pour votre propre code, YAGNI.

J'espère que cela vous donne assez pour commencer, cependant.

En ce qui concerne l'utilisation d'un liant modèle sans la pile Web: Eh bien, vous avez encore besoin MVC, mais pas nécessairement un serveur web. Voici comment nous le faisons dans un test unitaire:

    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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top