2010-02-06 4 views
1

J'ai donc ce ascx (PartialView) contrôle - ControlTempASP.NET MVC - RenderAction - PartialView - BeginForm() - formes multiples

j'ai un ajax.BeginForm à l'intérieur ControlTemp comme ceci:

<% using (Ajax.BeginForm("ControlTemp", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "divControlTemp" })) { 
     .... 
     <input type = "submit" /> 
     <%}%> 

intérieur de mon masterpage, je me sers de ce PartialView comme

<div id = "divControlTemp"> <% Html.RenderAction("ControlTemp", "Home", null); %></div> 

maintenant, le problème est si j'ai une page qui utilise cette page principale et la page ne postback à afficher, cette fonction est aussi b eing tiré:

[ActionName("ControlTemp"), AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult ControlTemp(string URL) 
     { 
      ... 
      return PartialView("ControlTemp"); 
     } 

REMARQUE: Même si j'utilise Html.BeginForm au lieu de Ajax.BeginForm, les méthodes ci-dessus finit toujours être déclenché

La page qui utilise ce masterpage:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 

<asp:Content ID="loginTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    Log On 
</asp:Content> 

<asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Log On</h2> 
<p> 
    Please enter your username and password. <%= Html.ActionLink("Register", "Register") %> if you don't have an account. 
</p> 
<%= Html.ValidationSummary("Login was unsuccessful. Please correct the errors and try again.") %> 

**<% using (Html.BeginForm("LogOn", "Account")) { %>** 
    <div> 
     <fieldset> 
      <legend>Account Information</legend> 
      <p> 
       <label for="username">Username:</label> 
       <%= Html.TextBox("username") %> 
       <%= Html.ValidationMessage("username") %> 
      </p> 
      <p> 
       <label for="password">Password:</label> 
       <%= Html.Password("password") %> 
       <%= Html.ValidationMessage("password") %> 
      </p> 
      <p> 
       <%= Html.CheckBox("rememberMe") %> <label class="inline" for="rememberMe">Remember me?</label> 
      </p> 
      <p> 
       <input type="submit" value="Log On" /> 
      </p> 
     </fieldset> 
    </div> 
<% } %> 

Voir le Html.BeginForm dans le code ci-dessus ... le LogOn ActionMethod est tiré, mais il est des tirs ActionMethod de cette ano forme aussi bien!

Une autre personne a publié ce billet problème, mais s/il n'a pas eu une solution:

POST method called on MVC UserControls as well as their parent views

Note: Il n'y a pas de formes imbriquées

+0

nettoyer votre code ... –

Répondre

1

Le problème est que MVC réplique méthode HTTP de vue parent pour chaque appel RenderAction() à peu importe si sa forme a effectivement émis une publication ou ne pas.

Vous devrez créer votre propre fonctionnalité comme je l'ai fait. J'ai réécrit ceci pour que je puisse appeler le Html.RenderAction(HttpVerb.Get, ...). Cela permet de rendre toujours certaines actions comme GET, peu importe si la page contenant est un appel POST. Dans votre cas, cela résoudrait le problème, car le rendu de la vue partielle (avec la forme ajax) sur votre maître devrait toujours être appelé GET. Vous Ajax fait des POST de toute façon.

+0

Avait le même problème que OP. Je ne suis pas sûr d'avoir compris votre exemple, mais en utilisant votre conseil, j'ai changé les formulaires dans les partiels à GET et ils ont cessé d'être déclenchés sans affecter le reste de la fonctionnalité. Merci. –

2

Pourquoi ne pas utiliser jQuery. Code de votre bouton:

<input type="submit" id="submitButton" /> 

Code jQuery:

$(document).ready(function() { 
    $('#submitButton').click(function() { 
     $('#divControlTemp').load('Controller/Action/Parameters'); 
    }); 
}); 
+1

qui n'est pas une bonne réponse, il est juste une solution de contournement. – TPR

+0

En ce qui concerne le code, cela ne résoudra pas le problème. Les publications régulières publient toujours toutes les autres RenderActions internes ... –

1

post action doit retourner même résultat pour obtenir un poste par code vide sanitaire:

[ActionName("ControlTemp"), AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult ControlTemp(string URL) 
     { 
      if(this.ControllerContext.IsChildAction) 
       return ControlTemp()//Get action method 
      ... 
      return PartialView("ControlTemp"); 
     } 
Questions connexes