2015-09-03 4 views
2

Когда я использую помощник BeginFormSitefinity, форма формы исчезает после отправки, а затем выполняется обратная передача.Форма BeginFormSitefinity исчезает после отправки

Ожидаемое поведение было бы только последующей обработкой. Я пошел в браузер и исследовал, и я узнал, что при использовании BeginFormSitefinity в ваш html добавляется дополнительный скрипт.

Этот скрипт в основном создает новую форму с отображением = none. И добавляет вашу форму в «невидимую» форму, и, таким образом, ваша форма исчезает после отправки.

Я использую Sitefinity 8.1, и я хотел бы знать, есть ли способ избежать этого?

Это скрипт добавил (я не имею никакого контроля над ним):

<script type="text/javascript"> 
      (function() { 
       var container = document.getElementById("myForm2"); 
       if (container === null) 
        return; 

       var inputs = container.querySelectorAll("input"); 
       var allInputs = document.forms["aspnetForm"].querySelectorAll('input'); 
       for (var i = 0; i < allInputs.length; i++) { 
        allInputs[i].addEventListener("invalid", function(event) { 
         if (Array.indexOf(inputs, document.activeElement) >= 0 && Array.indexOf(inputs, event.target) < 0) 
          event.preventDefault(); 
        }, true); 
       } 

       var submitClick = function() { 
        var isValid = true; 
        for (var i = 0; i < inputs.length; i++) { 
         if (typeof inputs[i].willValidate !== "undefined" && inputs[i].willValidate) 
          isValid = inputs[i].validity.valid && isValid; 

         if (typeof jQuery !== "undefined" && typeof jQuery.validator !== "undefined") 
          isValid = jQuery(inputs[i]).valid() && isValid; 
        } 

        if (isValid) { 
         var form = document.createElement("form"); 

         form.style.display = "none"; 
         form.setAttribute("action", "/order-calendar/Search"); 
         form.setAttribute("method", "POST"); 
         form.setAttribute("enctype", document.forms["aspnetForm"].getAttribute("enctype")); 
         form.setAttribute("encoding", document.forms["aspnetForm"].getAttribute("encoding"));        

         form.appendChild(container); 

         document.body.appendChild(form); 

         // We prevent kendo upload widget from submitting empty inputs. 
         var kInputs = container.querySelectorAll(".k-upload input[type='file']"); 
         for(var i = 0; i < kInputs.length; i++) { 
          var kInput = kInputs[i]; 
          if (!kInput.value) { 
           // Prevent submitting an empty input 
           kInput.setAttribute("disabled", "disabled"); 

           window.setTimeout(function() { 
            kInput.removeAttribute("disabled"); 
           }, 0); 
          } 
         } 

         form.submit(); 

         return false; 
        } 
       }; 

       var handleFormSubmitElements = function (elementName) { 
        var allSubmitElements = container.getElementsByTagName(elementName); 
        var elementCount = allSubmitElements.length; 
        while(elementCount) { 
         typeAttr = allSubmitElements[elementCount - 1].getAttribute("type"); 
         if(typeAttr == "submit") { 
          allSubmitElements[elementCount - 1].onclick = submitClick; 
         } 
         elementCount--; 
        } 
       }; 

       handleFormSubmitElements("input"); 
       handleFormSubmitElements("button"); 
      })(); 
     </script> 

Это моя форма (ее значения считываются автоматически, поэтому OnKeyDown возвращает ложь):

@using (Html.BeginFormSitefinity("Search", "myForm2")) 
    { 
    <div id="main_content" style="max-width: 600px; max-height:700px;float:left;overflow: hidden;"> 

    <table> 
       <tr><td colspan="2" style="text-align:center;">@Html.Label("City")</td></tr> 

       <tr> 
        <td>@Html.Label("Code") </td> 
        <td> 

         @Html.Kendo().TextBoxFor(x => x.Code).HtmlAttributes(new { onkeydown = "return false", style = "color: green; width:100%;", id = "Code" }) 
        </td> 
       </tr> 
       <tr> 
        <td>@Html.Label("City Code") </td> 
        <td> 

         @Html.Kendo().TextBoxFor(x => x.CityCode).HtmlAttributes(new { onkeydown = "return false", style = "color: green; width:100%;", id = "CityCode" }) 
        </td> 
       </tr> 

     </table> 

    <input type="submit" class="btn btn-success" value="submit"> 
} 

Это то, что происходит визуально:

enter image description here

+0

Вы возвращаете представление из своего действия HttpPost? –

+0

Привет @Veselin Vasilev Я перенаправляю к индексу действия, подобному этому -> ** RedirectToAction ("") **, у меня был View («Default») и View («Default», Model). Первая дает мне ошибку, вторая меня перенаправляет на пустую страницу – Nelssen

+0

что такое ошибка? только для теста - попробуйте с Response.Redirect и посмотрите, работает ли это –

ответ

2

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

До v8.1 на JavaScript вы размещены выше был другой, и будет изменять фактическую форму тега страницы WebForms, чтобы отправлять сообщения в пользовательских действий ...

теперь кажется, что они представить в виде тега построенный на лету для виджетов MVC ...

Одна вещь, которую я заметил, у них все еще есть идентификатор тега FORM, жестко закодированного как «aspnetForm», поэтому, если ваша Мастер-страница не использует это явное , то конкретный идентификатор тогда может быть, вероятно, причиной ...

если вы установили точку останова в действии, к которому относится ваша форма, вы получаете удар?

+0

Извините за поздний ответ SelAromDotNet. Я не знаю, как вы это знаете, но да. они все еще имеют жестко закодированный aspnetForm, вы обязаны использовать это имя на главной странице, иначе он не будет работать. да, я получаю Хит в действии, действительно не знаю, как этого избежать. В эти выходные я сделаю то, что предложил Веселин, и другие попытки. Давайте посмотрим, будет ли эта уродливая ошибка закрыта. – Nelssen

+0

ohhh я полностью неправильно понял ваш вопрос. вы говорите, что SF вводит вашу форму в этот новый элемент динамической формы, и поскольку она скрыта, она заставляет вашу форму исчезать до того, как она закончит сообщение ... В этом случае, возможно, вы можете играть с CSS, например, добавив «display: block ! important ", а также позиционирование нового тега FORM, созданного Sitefinity, чтобы при добавлении он помещался в одно и то же место. Очень хакеры, но так же и реализация MVC:/Не могу поверить, что я никогда не замечал, что это так, удачи! – SelAromDotNet

+0

О, вы протестировали его прямо сейчас и заметили «ошибку»? ehehe :) Да, я попробую это в выходные, потому что у меня все еще есть другие проблемы, связанные с Sitefinity, чтобы решить! – Nelssen

2

У нашей команды также была та же проблема. Был создан билет поддержки в Telerik. И есть ответ:

По сути, это ожидаемое поведение при использовании BeginFormSitefinity. Причины этого случаются потому, что в веб-формах ASP.NET на странице разрешена только одна форма с runat = "sever". Вот почему BeginFormSitefinity отображается как div по умолчанию, и форма динамически создается и отправляется при нажатии кнопки отправки. Чтобы преодолеть это поведение, вам нужно создать собственный помощник и HybridForm. Вы можете посмотреть следующие StackOverflow answer для получения дополнительной информации о том, как создать пользовательский HybridForm.

+1

не достижимый. я наконец получил шанс проверить это снова и вернулся сюда, чтобы узнать, есть ли какие-либо обновления. я не вижу, как реализация вашей собственной гибридной формы будет иметь какое-то значение, поскольку все это будет заключаться в том, чтобы изменить поведение от невидимости, чтобы заставить его перейти в нижнюю часть экрана (поскольку он добавлен к телу). ваша команда когда-либо находила какой-либо способ обойти это? – SelAromDotNet

+0

К сожалению, нам не нравится решение, которое мы наконец использовали в качестве обходного пути. В общем * BeginFormSitefinity * HTML-хелпер был исключен из исходного кода и был написан JavaScript-код, который отправляет данные на сервер. В качестве улучшения он может работать с использованием атрибутов HTML-тегов и инициализироваться только один раз после загрузки страницы. Но это не решение, это просто возможно обходное решение ... – pryabov

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