2010-05-28 5 views
0

Dans mon ASP.net MVC View j'ai une liste déroulante que je veux obtenir des détails sur la sélection et mettre à jour de façon asynchrone un div. Mon ASPX est la suivante:Routage ASP.net MVC sur Postback

<% using (Html.BeginForm("Index", "Portal", FormMethod.Post, new { id = "TheForm" })) 
    {%> 

    <h2>Index</h2> 

    <% using (Ajax.BeginForm("Details", new AjaxOptions { UpdateTargetId = "mpkResults" })) 
     { %> 

    <%=Html.DropDownList("Docs", (IEnumerable<SelectListItem>)ViewData["Docs"], 
     new { onchange = "document.getElementById('TheForm').submit();" })%> 

    <p><input type="submit" value="Details" /></p> 

    <% } %> 

    <div id="mpkResults" style="margin:10px 0px 0px 0px;"></div> ... 

L'événement se déclenche onchange correctement sur la sélection de la liste déroulante, mais au lieu de la méthode détails dans mon code derrière le tir, il frappe ma méthode d'index. Pourquoi la méthode des détails ne se déclenche-t-elle pas sur l'événement onchange? Ma méthode Détails() dans le contrôleur est:

public ActionResult Details() 
    { 
     ... < It never gets here, just goes to the index() method 
    } 

Il est un peu frustrant en ce moment que je suis sûr que c'est une simple erreur, mais pas sûr de ce qu'il pourrait être. Je regardais la source de ma page et bien sûr, la forme ressemble à elle devrait être routage à l'action Détails:

<form action="/Portal/Details" method="post" ... 

Toute aide serait appréciée.

Répondre

2

C'est parce que dans votre gestionnaire onchange, vous appelez la méthode submit() sur la TheForm forme au lieu de votre formulaire AJAX:

new { onchange = "document.getElementById('TheForm').submit();" })%> 
               ^^ wrong form ID 

Donnez votre AJAX former un autre ID, et utiliser à la place.

+0

Merci Fyodor, j'ai négligé ça, bonne prise! Comment spécifiez-vous l'ID de formulaire dans Ajax.BeginForm()? Je ne vois pas cela comme un paramètre ... –

+0

Utilisez une surcharge qui a l'argument 'htmlAttributes', comme vous le feriez avec' Html.BeginForm() '. Si ma réponse vous a aidé, pourriez-vous envisager de l'accepter? –

+0

Fyodor, j'ai trouvé un qui avait ce paramètre, et utilisé <% using (Ajax.BeginForm ("Details", "", nouveau AjaxOptions {UpdateTargetId = "mpkResults"}, nouveau {id = "SubForm"})) {%> <% = Html.DropDownList ("Docs", (IEnumerable ) ViewData ["Documents"], new {onchange = "document.getElementById ('SubForm'). Submit();"})%> Il génère maintenant le code HTML correct avec un "SubForm", mais la méthode Index() est toujours en cours d'appel. Je me ferai un plaisir de marquer la vôtre comme réponse, mais je voudrais voir la méthode Details s'exécuter, c'est la confirmation que cela fonctionne –