Question

Je ne faisais que regarder la présentation de Scott Hanselman sur ASP.NET MVC à San Francisco. Après y avoir réfléchi pendant un certain temps, j'étais perplexe quant à la façon d'aborder la meilleure construction d'un site basé sur ASP.NET MVC qui a une. Structure (choisir votre définition préférée) [portail | | modulaire multi-vues]

Pour vous donner une idée de ce que je suis après, mon entreprise construit un grand nombre d'applications de style portail pour les clients sur qui intègrent un module de cartographie qui peut répondre à ses propres chaînes de requête et d'itinéraires, module d'information parcellaire fiscal de la même a son propre point de vue (s), visionner document de recherche qui affiche les documents uniques et multiples ... vous voyez l'idée. La partie critique est que chaque module est vraiment autonome. Si un utilisateur recherche un dossier fiscal par nom, ils pourraient voir 10 résultats ( « JOHN DOE » possède quelques propriétés). Chaque résultat a un lien « Carte ce » parce que le cadre de l'application de site Web sait qu'il ya un module de carte disponible. Le lien « Ajouter à la carte » envoie la demande droite comme http://myapp.com/taxparcel/map/123443 . Le contrôleur de module de carte répond à la demande externe en effectuant un zoom sur la carte et mettant en évidence la parcelle fiscale.

La clé de ce flux tout est que à la fois les modules fiscaux et de cartographie sont sur la même page Web.

Alors, comment cette forme dans la zone ASP.NET MVC? ? Partials vues sous? vues multiples pour un seul contrôleur? Si je manque juste la partie évidente de la documentation alors ne hésitez pas à me fustiger publiquement et inclure le lien. Sinon, je suis très ouvert aux suggestions.

Était-ce utile?

La solution

Eh bien, votre modèle de vue doivent fournir des points d'extension. Je suppose que les données pour la vue ne contient les parties du module, et est choisi par le contrôleur en quelque sorte:

public ActionResult Search(string text)
{
   var model = seachService.Search(text)
   // here either:
   // 1. model contains .Modules collection and is populated by the service, or
   // 2. controller does
   var viewmodel = new SearchViewModel(model, modulesService.GetModulesFor(model));
   // i.e. it adds modules-specific information to the view data
   return View(model);
}

Maintenant, les données spécifiques des modules est converti par SearchViewModel en quelque chose qui peut utiliser Voir:

public interface IModuleSpecificViewPart
{
  public IList<string> GetAdditionalLinksForUser();
  public void RenderAdditionalInfo(Response response);
}

et votre point de vue Finalité

<%= Model.Results[i] %>
<% foreach (var module in Model.ModuleSpecific) { %> 
<a href="<%=module.AdditionalLink%>">More</a> 
<% module.RenderAdditionalInfo(Response); %>
<% } %>

modèle de vue du module peut fournir le nom de vue partielle, etc. Notez qu'il est modules.GetModulesFor () et SearchViewModel qui font le travail - par exemple, SearchViewModel peut faire IoC.GetInstanceByType ( « ModuleViewModel » + passedModule.GetType (). nom) -. prendre automatiquement le point de vue module spécifique classe modèle

Telle est l'idée. Il peut être que je comprends votre question tout à fait tort -. Désolé si oui

Un conseil, personnellement, je trouve que si j'essaie d'être trop générique, il ajoute des complications unneccessary au projet (j'ai même a écrit à ce sujet). C'est à dire. oui vos modules ne sont pas connus au moment de la compilation, mais vous devez savoir quelque chose sur eux! Ils peuvent ajouter un lien au premier résultat de recherche - voici le point d'extension pour cela. On ne peut pas les images des points d'extension pour « quoi que ce soit », donc d'abord vous aurez besoin de la liste de vos cas particuliers.

Autres conseils

Je pense que la réponse de Reine3 est plus adapté à votre problème mais je pensais que je posterai mes idées sur la question générale de toute façon.

J'envisage de faire quelque chose de similaire en utilisant les techniques décrites dans Matthew Abbott blogpost . En utilisant MEF, il vous suffit de déposer une nouvelle dll dans votre portail pour activer un module.

Avoir plusieurs modules sur une seule page est un peu Tricker. RenderPartial pourrait fonctionner, mais qui est généralement destiné à ajouter un code qui fonctionne à partir du même modèle de vue. RenderAction d'autre part utilise son propre contrôleur et le modèle. En général, je ne favoriserait pas l'utilisation RenderAction dans un autre scénario, car il se casse ou au moins convolutions le modèle MVC. Dans ce cas cependant, il ne serait utilisé que sur une seule page qui est responsable de la pose des modules multiples. Tous vos plugins pourraient être vues réguliers MVC, les contrôleurs et les modèles.

Détails sur RenderAction sont disponibles ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top