2009-05-19 4 views
0

Première fois post,Mon code du contrôleur d'action semble amateurisme

J'ai joué avec MVC abit ... J'ai une vue qui a plusieurs champs d'entrée, certains de ces champs peuvent être vides sur le poteau.

La méthode d'action à l'intérieur du contrôleur pour le poste ressemble à quelque chose comme ça

public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember) 

Je me sers de l'extension DynamicQuery qui a été kicking autour afin d'effectuer querys Linq dynamiques sur ma base de données et je Ve encapsulé ceci dans un objet de recherche qui est passé à la couche d'accès aux données pour l'exécution.

Cependant, j'ai aussi un objet ViewData personnalisé qui est repassée à la vue pour afficher les valeurs d'entrée et les résultats de la requête.

tout semble un peu méchant dans le code que je vais avoir à régler les deux propriétés de l'objet de recherche et les ViewDatas.

public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember) { 
var search = new Search { 
Id = id, 
FirstName = firstName, 
LastName = lastName, 
Member = isMember 
}; 

var memberViewData = new MemberViewData { 
Id = id, 
FirstName = firstName, 
LastName = lastName, 
Member = isMember 
}; 

memberViewData.Results = _dataRepository.GetMember(search); 

return View("Search", memberViewData); 

} 

Suis-je sur la pensée et ce devrait vraiment juste transmettre les valeurs à la couche d'accès aux données et alimenter le ViewData dans le contrôleur, ou est-il beaucoup plus élégant motif ou pratique, je pourrais utiliser?

Désolé si cela semble décharge, pas attribuer de personnes pour échanger des idées et de temps pour creuser dans le cadre.

Répondre

1

Selon votre classe extrait MemberViewData a la propriété Résultats en plus des propriétés de la classe de recherche. La première étape consiste donc à faire en sorte que ViewViewData dérive de la recherche et à définir un constructeur qui accepte l'instance de recherche en tant que paramètre et en affecte les propriétés de base. Ensuite, je voudrais changer la méthode d'action comme suit:

public ActionResult Filter(Search search) 
{ 
    return View("Search", new MemberViewData(search) 
    { 
     Results = _dataRepository.GetMember(search) 
    }); 
} 
+0

intresting, mais si je comprends bien, je ne peux passer des champs d'entrée de la vue à la méthode ActionMethod, où est instancié de recherche? –

+0

juste réussi à trouver un peu de temps à jouer avec cela et je peux voir que Mvc va essayer de lier les champs de formulaire aux propriétés de l'objet par défaut sans codage supplémentaire !! –

+0

Oui, c'est correct. Il utilise un classeur de modèle par défaut que vous pouvez remplacer si vous avez besoin d'un contrôle plus fin sur la liaison des paramètres. –

2

Utilisez ModelBinder pour lier les données

0

Comme Tadeusz mentionné, un ModelBinder peut aider à construire le MemberViewData pour vous, ce qui ne laisserait que les résultats à extraire.

Vous pouvez également décider de la création d'un service de présentation qui comprend comment construire ce point de vue objet de données et simplement déléguer. Je préférerais l'approche du modèle de liant ici cependant.

Questions connexes