2010-02-06 2 views
1

Так что у меня этот ASCX (PartialView) контроль - ControlTempASP.NET MVC - RenderAction - PartialView - BeginForm() - множественные формы

У меня есть Ajax.BeginForm внутри ControlTemp так:

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

Внутри моей MasterPage, я использую этот PartialView, как

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

Теперь проблема, если у меня есть страница, которая использует эту главную страницу и страница не постбэк к сообщению, эта функция также б Eing уволили:

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

ПРИМЕЧАНИЕ: Даже если я использую Html.BeginForm вместо Ajax.BeginForm, эти методы все еще заканчивает тем, что срабатывает

страница, которая использует этот 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> 
<% } %> 

См выше коде Html.BeginForm ... The LogOn ActionMethod стреляют, но он стреляет ActionMethod этого ANO форма также!

Другой человек отправил эту проблему, но он/она не имеет решения:

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

Примечание: Там нет вложенных форм

+0

очистить ваш код ... –

ответ

1

Проблема заключается в том, что MVC не дублирует метод HTTP от родительского вида для каждого RenderAction() вызова в ней независимо от того, является ли его форма фактически выдал постбэк или не.

Вам нужно будет создать свою собственную функциональность так, как я сделал. Я переписал это, чтобы позвонить Html.RenderAction(HttpVerb.Get, ...). Это позволяет всегда выполнять какое-либо действие как GET, независимо от того, является ли страница страницей POST-вызовом. В вашем случае это решит проблему, потому что рендеринг частичного представления (с формой ajax) на вашем хозяине всегда следует называть GET. Вы Ajax все равно должны делать POST.

+0

Имел ту же проблему, что и OP. Не уверен, что я понял ваш пример, но, используя ваш совет, я изменил формы в партитурах на GET, и они перестали запускаться, не затрагивая остальную функциональность. Благодарю. –

2

Почему бы не использовать JQuery. Код для кнопки:

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

JQuery код:

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

, которое не является правильным ответом, это просто обходной путь. – TPR

+0

Что касается кода, это не решит проблему. Регулярные postbacks всегда будут POST всех других внутренних RenderActions ... –

1

Сообщение действие должно возвращать тот же результат для ВЫВЕШУ както парование код:

[ActionName("ControlTemp"), AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult ControlTemp(string URL) 
     { 
      if(this.ControllerContext.IsChildAction) 
       return ControlTemp()//Get action method 
      ... 
      return PartialView("ControlTemp"); 
     } 
Смежные вопросы