2015-09-03 97 views
2

當我使用BeginFormSitefinity幫助器時,表單在提交後消失,然後回發完成。BeginFormSitefinity表單在提交後消失

預期的行爲將只是回發要完成。我去了瀏覽器並進行調查,發現當你使用BeginFormSitefinity時,一個額外的腳本被添加到你的html中。

該腳本基本上創建一個新的形式與顯示=無。並將您的表單附加到「隱形」表單中,因此您的表單在提交後會消失。

我正在使用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返回false):

@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(「」)**,我有視圖(「默認」)和視圖(「默認」,模型)。第一個給我錯誤第二個將我重定向到空白頁面 – Nelssen

+0

錯誤是什麼? 只是爲了測試 - 嘗試與Response.Redirect,看看是否有效 –

回答

2

,如果你正在使用混合MVC(這是MVC小部件的webforms版本),那麼我相信沒有辦法避免這種情況。

此之前V8.1你上面貼是不同的,並會修改Web表單頁面的實際形式標籤張貼到您的自定義操作的JavaScript ...

現在看來他們提交到表單標籤建立在飛MVC的小部件

有一件事我注意到他們仍然是ID的FORM標籤硬編碼爲「aspnetForm」,所以如果你的母版頁不使用顯式,具體的ID那麼這可能是一個可能的原因...

如果您在表單發佈的操作中設置了斷點,您是否遇到了問題?

+0

對不起,SelAromDotNet遲到的回覆。我不知道你怎麼知道,但是是的。他們仍然有aspnetForm硬編碼,你必須在主頁上使用該名稱,否則它將無法正常工作。是的,我在行動中遇到了一擊,真的不知道如何避免這種情況。這個週末我會做什麼Veselin建議和其他嘗試。讓我們看看這個醜陋的bug是否會被關閉。 – Nelssen

+0

哦,我完全誤解了你的問題。你說SF會將你的表單注入到這個新的動態表單元素中,並且由於它隱藏了,它會在表單完成之前使表單消失......在這種情況下,也許你可以使用CSS來添加「display:block !important「,以及定位Sitefinity創建的新FORM標籤,以便在添加它時將它放置在相同的位置。非常黑客,但MVC實現也是如此:/不敢相信我從來沒有注意到它這樣做,祝你好運! – SelAromDotNet

+0

哦,您現在已經測試過並注意到「bug」了嗎? ehehe :)是的,我會在週末嘗試它,因爲我還有另一個Sitefinity相關問題需要解決! – Nelssen

2

我們的團隊也有同樣的問題。被創建了Telerik的支持票。並且有一個答案:

基本上,這是使用BeginFormSitefinity時的預期行爲。發生這種情況的原因是因爲在ASP.NET Web表單中只允許在頁面上使用runat =「sever」的一種形式。這就是爲什麼BeginFormSitefinity默認呈現爲div,並且在點擊提交按鈕時動態創建和提交表單的原因。爲了克服這種行爲,你需要創建一個自定義幫手和HybridForm。有關如何創建自定義HybridForm的更多信息,請參閱以下StackOverflow answer

+1

令人難以置信。我終於有機會再次測試,並回到這裏看看是否有任何更新。我沒有看到如何實現你自己的混合形式會有所作爲,因爲所有這些都會將行爲從不可見轉變爲使其跳到屏幕的底部(因爲它被附加到主體)。你的團隊是否曾找到解決這個問題的方法? – SelAromDotNet

+0

不幸的是,我們不喜歡我們最終用作解決方法的解決方案。常見的* BeginFormSitefinity * HTML幫助程序被排除在源代碼之外,並被寫入將代碼發送到服務器的JavaScript代碼。作爲一種改進,它可以通過使用HTML標籤屬性起作用,並且在頁面加載後僅初始化一次。但這不是一個解決方案,這只是可能的解決方法... – pryabov