2010-12-02 4 views
1

J'ai deux méthodes d'action qui ressemblent à cefortement typées Vues modèle sur un RedirectToAction

[HttpPost] 
    public ActionResult Search(Models.InputModel input) 
    { 
     if (!IsSearchCriteriaValid(input)) 
      return RedirectToAction("Index"); 

     TempData[TempDataSearchInput] = input; 

     return RedirectToAction("List"); 
    } 

    public ActionResult List() 
    { 
     var input = TempData[TempDataSearchInput] as Models.InputModel; 

     if (!IsSearchCriteriaValid(input)) 
      return RedirectToAction("Index"); 

     var result = new List<MyDTO>(); 

     AutoMapper.Mapper.Map(_repository.GetBy(input), results); 

     var model = new Models.DisplayListModel { Result = result }; 
     return View("List", model); 
    } 

Est-il possible les meilleures pratiques standard pour faire quelque chose comme ça?

+0

duplication possible de [MVC - Passing Data avec RedirectToAction()] (http://stackoverflow.com/questions/672143/mvc-passing-data-with-redirecttoaction) –

Répondre

0

Oui, vous devez simplement supprimer l'action de recherche en tant que son code de duplication juste (même code que la liste), puis rediriger vers la liste! Donc, le code est redondant. Si vous le souhaitez, vous pouvez renommer votre action combine pour donner un sens plus significatif à votre code maintenant que vous les avez combinés, peut-être SearchToList() ou quelque chose. Ne pas utiliser les redirections lorsqu'elles ne sont pas nécessaires est la meilleure pratique. Faites-moi savoir si cela répond à votre question ou si je peux faire quelque chose de plus pour vous, merci.

1

Erx_VB.NExT.Coder est correct. Le code dans l'action de recherche n'est pas nécessaire. Je suppose que vous l'avez fait, parce que votre formulaire est posté sur/[controller]/Search? Vous pouvez toujours utiliser la vue search.aspx si vous le souhaitez et pointer simplement le formulaire vers/[controller]/List comme ci-dessous.

<% using (Html.BeginForm("foo", "bar", FormMethod.Post, new { id = "myID" })) 
     { %> 
    <%} %> 
will result in the following HTML: 

<form action="/bar/foo" id="myID" method="post"></form> 
+0

upvoted ya un nouveau venu :) (et pour dire im correct, lol j/k) –

+0

Essayer de redonner aux gars qui m'ont tellement accroché. ;) – jsteve81

1

Je suis d'accord que vous devriez les combiner en un seul ActionResult. Une autre façon de le faire serait de créer un itinéraire personnalisé. Donc, dans votre fichier Global.asax, ajoutez ce qui suit à votre fonction RegisterRoutes:

routes.MapRoute("MySearch", "MyController/Search", 
    new { controller = "MyController", action = "List" } 
); 

qui tracera automatiquement tous les appels à la recherche à la liste, et supprimera la nécessité d'avoir les deux ActionMethods définis dans votre code

+0

un autre nouveau venu ... est upvoted par moi :) –

+0

hah merci ^^ été caché pendant des années, figuré son temps pour essayer de redonner ~ – TheRightChoyce

Questions connexes