2010-10-27 9 views
1

J'ai une vue appelée Associations qui a une liste déroulante et un bouton. Lorsque l'utilisateur sélectionne une option et appuie sur submit, je veux qu'il passe à Association/{associationKey}. L'association doit travailler sur get et post.simple formulaire MVC post et url question de routage .... J'espère

Actuellement, avec le code ci-dessous, lorsque le formulaire est publié, il va à l'association et affiche l'enregistrement correct, mais il n'ajoute pas l'associationKey à l'URL.

Je reçois:

http://localhost/Association

au lieu de:

http://localhost/Association/202

Si je navigue manuellement http://localhost/Association/202 tout fonctionne parfaitement, alors publierez travaillent tous deux bien .. .. Je veux juste la clé dans l'URL après un post!

Sûrement il doit y avoir quelque chose de super simple que je fais mal. Code pertinent ci-dessous.

Merci!

ASSOCIATIONS Vue:

<% Html.BeginForm("Association", "Staff", FormMethod.Post); %> 
<%:Html.DropDownList("associationKey", new SelectList(Model.Associations.ToList(), "AssociationKey", "LegalName"))%> 
<input type="submit" value="Edit The Selected Record" /> 
<% Html.EndForm(); %> 

contrôleur PERSONNEL:


     [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 
     public ActionResult Association(int associationKey) 
     { 
      return View("Association", new AssociationViewModel(associationKey)); 
     } 

Global.asax:


     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapRoute("Default", "{action}", new { controller = "Staff", action = "Default" }); 
      routes.MapRoute("Associations", "Associations", new { controller = "Staff", action = "Associations" }); 
      routes.MapRoute("Association", "Association/{associationKey}", new { controller = "Staff", action = "Association" }); 
     } 

modèle de vue ASSOCIATION:


    public class AssociationViewModel 
    { 

     public Repository db = new Repository(); 

     public Association Association {get; private set; } 

     public List TelephoneTypes { get; private set; } 

     public AssociationViewModel(int associationKey) 
     { 
      Association = db.AssociationById(associationKey); 
      TelephoneTypes = db.ListTelephoneTypes().ToList(); 
     } 

    } 

Répondre

2

Je pense que vous devez séparer vos actions de contrôleur dans une action Get et une action POST comme ceci:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Association(int associationKey) 
{ 
    return View("Association", new AssociationViewModel(associationKey)); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Association(AssociationViewModel model) 
{ 
    return RedirectToAction("Association", new {associationKey= model.associationKey}); 
} 

L'infrastructure MVC liera automatiquement la valeur sélectionnée de votre SelectList au modèle (en supposant que vous ayez une propriété dans le modèle pour contenir la valeur sélectionnée). De là, vous avez juste besoin de rediriger vers votre méthode GET en passant la clé.

+0

La vue Association est POSTée à partir de la vue Associations, il n'y a donc pas d'AssociationViewModel à transmettre à la vue Association. La seule chose que j'ai est l'associationKey. – Blackcoil

+0

En divisant en deux actions de contrôleur, et que votre action POST reçoive un paramètre AssociationViewModel, le framework instanciera et liera le modèle pour vous et le passera à la méthode d'action. Essayez-le et mettez un point d'arrêt et voyez ce que vous obtenez. Assurez-vous simplement d'ajouter un constructeur vide à la classe AssociationViewModel en premier. –

+0

La solution était double. D'abord, je me suis scindé en actions GET et POST comme vous l'avez suggéré, et j'ai passé la commande FormCollection au POST, puisque l'associationKey est là. De plus, mes itinéraires étaient dans le mauvais ordre. Les routes par défaut viennent en dernier, les routes spécifiques viennent en premier. – Blackcoil

1

Il fait un post au lieu d'un GET. Cela met la valeur dans les paramètres de formulaire pas dans l'URL. Vous pouvez intercepter le formulaire soumettre en utilisant javascript et le transformer en un GET en utilisant location=..

<script type="text/javascript"> 
    $(function() { // requires jQuery 
     $('form').submit(function() { 
      // maybe do some validation to ensure a legal value chosen first? 
      location.href = $(this).attr('action') + '/' + $(this).find('select').value(); 
      return false; // cancel submit 
     }); 
    }); 
</script> 

<% Html.BeginForm("Association", "Staff", FormMethod.Post); %> 
<%:Html.DropDownList("associationKey", new SelectList(Model.Associations.ToList(), "AssociationKey", "LegalName"))%> 
<input type="submit" value="Edit The Selected Record" /> 
<% Html.EndForm(); %>