2013-04-02 2 views
1

Я знаю, что, возможно, название звучит немного странно, но я считаю, что моя проблема странная. У меня есть приложение ASP.NET MVC 4 (это мое первое приложение MVC реального мира) с Razor view-engine.View form вызывает обратную передачу всех действий контроллеров с помощью [HttpPost] с разных контроллеров

У меня есть вид макета, где я рендеринг два частичных вида, как это:

<!-- Login --> 
@Html.Action("RenderLoginPopup", "Login") 

<!-- Registration --> 
@Html.Action("RenderRegisterPopup", "Login") 

Каждые из этих действий со стороны Вход контроллера просто визуализирует частичный вид:

[ChildActionOnly] 
    public ActionResult RenderLoginPopup() 
    { 
     return PartialView("Partial/_LoginPopupPartial"); 
    } 

Только для (оба построены одинаково), частичный вид входа содержит форму ajax следующим образом:

@using (Ajax.BeginForm("Login", "Login", new AjaxOptions() 
    { 
     HttpMethod = "POST", 
     OnSuccess = "loginResponseReceived" 
    }, new { @id = "loginForm" })) 

Войти действие от Вход контроллера (цель формы) подписывается со следующими атрибутами (стоит отметить, и обратите внимание на HttpPost один):

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public JsonResult Login(LoginModel model) 
    { } 

До сих пор, так хорошо ... все работает отлично - как логин, так и действия регистра работают без каких-либо проблем.

Проблема, о которой я хочу поговорить, когда у меня есть @ Html.BeginForm() в представлении, которое загружается вместе с основным макетом. Например, если у меня есть чистая и простая форма, как это:

@using (Html.BeginForm()) 
    { 
     <input type="hidden" name="name"/> 
     <input type="submit" value="Send"/> 
    } 

вместе с CaptionExtendedController контроллера:

[HttpPost] 
    public ActionResult Index(string nume) 
    { 
     return View(); 
    } 

Таким образом, в конце концов, в моем окончательном HTML сгенерированного файл у меня будет 3 формы - 2 для входа и регистрации (ajax) и одна простая форма, сгенерированная из последнего представления. Пожалуйста, имейте в виду, что все три формы независимы (что означает, что они не являются одними из них).

Проблема в том, что каждый раз, когда я нажимаю кнопку «Отправить» из последней формы, все вызовы, которые подписываются с атрибутом [HttpPost] из моего представления (Login, Register from LoginController и Index из CaptionExtendedController).

ПОЧЕМУ ??? Чтобы иметь временное исправление, я удалил атрибут [HttpPost] из действий Login и Register, и теперь он работает, но я не думаю, что это правильно.

Пожалуйста, есть кто-нибудь, кто может объяснить мне, почему это происходит, и в конечном итоге указать мне на правильное направление в решении этой проблемы?

Заранее спасибо.

+0

Я бы присвоил идентификатор каждой форме и обработал их с помощью jQuery, как [здесь] (http://stackoverflow.com/a/5410121/956051) – Lars

+0

Первые 2 уже сделаны с jquery через Ajax.BeginForm, но я необходимо, чтобы третья была нормальной. Кроме того, если бы я сделал это так, это будет означать, что все формы с этого момента, с моего сайта должны быть выполнены с использованием Ajax.BeginForm или jquery, правильно? На данный момент это не похоже на вариант. Спасибо за ваше время. – Edi

ответ

0

Попробуйте указать контроллер и действие с помощью Html.BeginForm, и мы можем начать с этого момента. Кроме того, вы можете использовать @ Html.RenderPartial, чтобы отобразить частичные части, которые избавились бы от некоторых ваших ненужных действий/контроллеров, что сделало бы его более управляемым.

+0

Это хорошая идея. Еще одно соображение, которое я не могу сказать из вашего опубликованного кода: возможно ли, что закрытие блоков использования для асинхронных форм отсутствует или каким-то образом упущено? Я бы предположил, что нет, но если у вас есть

, что может объяснить это. –

+0

Спасибо всем. Шаг за шагом: @MichaelKennedy - нет перекрытия формы open/close/using statements; Я также проверил файл сгенерированный HTML, и все формы открываются и закрываются отлично. – Edi

+0

Пример с Html.BeginForm был с простой страницы, созданной только для теста, но всегда все мои Html.BeginForm или Ajax.BeginForm получают действие и контроллер в качестве параметра. Что касается Html.RenderPartial вместо Html.Action - я использовал более позднюю версию, потому что я хотел, чтобы мои частичные представления (вход и регистрация) были их собственным контекстом и их собственными моделями; Я знаю, что могу передать пустую (новую) модель с помощью RenderPartial (это нормально для входа в систему), но для Регистрации мне нужно заполнить некоторые данные (DDL и т. Д.) В своем собственном контроллере. – Edi

0

Это не касается проблемы с корнем, но может быть обходным, что все, что вам нужно в любом случае. :)

Вы можете написать jQuery, который ловит кнопку, а затем отправляет форму непосредственно по имени.Например, если вы добавите ниже идентификатор:

@using (Html.BeginForm()) 
{ 
    <input type="hidden" name="name"/> 
    <input type="submit" id="regularSubmitButton" value="Send"/> 
} 

Тогда вы могли бы написать:

$(document).ready(function() { 
    $("#regularSubmitButton").click(function(e) { 
     e.preventDefault(); 

     $(this).parent("form").submit(); 

     return false; 
    }); 
}); 

Я не уверен, что это будет работать, не видя все, но, кажется, стоит попробовать.

Приветствие, Майкла

+0

Хммм ... Это приводит меня к другой идее - поставить некоторые «точки останова» (консоль.log) к этим событиям отправки форм, но ранее сегодня я смотрел, что происходит в Fiddler, и только одна форма отправляется на самом деле ... – Edi

+0

Кажется, что я нашел подобную проблему, но до сих пор не ответил ... :(http://stackoverflow.com/questions/11662852/submiting-one-form-posting-all-other-forms-in-the-page/15769866# – Edi

0

Это не имеет смысла больше ... Начиная от комментариев и ответов, я отображенное 3 функции в подашь на тех сложных формах: Логин, регистрация и индекс (также Я вернул атрибут HttpPost для действий входа и регистрации). В этих функциях jquery я просто поставил предупреждение со строкой (имя формы); чтобы иметь возможность написать селектор на основе jquery id, я также объявил последнюю форму с идентификатором (у нее ее не было, только для входа и регистрации было одно), как это (пример, взятый из другой формы с той же проблемой):

@using (Html.BeginForm("Index", "PersonalizeCard", new {data = Model.EncryptedDataQueryStringValue}, FormMethod.Post, new {@id = "personalizeCardForm"})) { } 

(что было добавлено - последние два параметра - метод формы и HTML ID).

После этого я запустил приложение и никаких исключений ... Я поставил контрольные точки на действия входа и регистрации - ничего ... Я даже удалил эти 2 дополнительных параметра из BeginForm - все еще ничего ...

ПОЧЕМУ ???? Опять же, почему ??? Я имею в виду, что я не расстроен тем, что он исправлен, но я не понимаю, почему он исправлен сам по себе ...

СПАСИБО ЗА ВАШЕ ВРЕМЯ И КОММЕНТАРИИ/ОТВЕТЫ.

Смежные вопросы