首页 > 解决方案 > 表单操作属性不适用于 jQuery 提交

问题描述

我有一个使用 Kendo UI v2015.2.624、bootstrap 3.4.1 和 jquery 2.2.4 的 ASP.NET MVC 应用程序。在其中一个视图中,我使用带有一些 li 项目的无序列表 ul 并使用 kendoPanelBar 构建了一种手风琴。这些 li 项目可以展开和折叠。

查看(cshmtl)

@model MyDTOs.customDTO

<form id="myForm" method="post">    
    <div id="divExample">
        <ul id="panelBarExample" class="panelBarExample">
            <li class="k-state-active">                
                <span>General Data</span>
                <div class="rootRow">                    
                    @{Html.RenderPartial("~/Areas/Path/To/Views/_View1.cshtml", Model);}

                    <input type="hidden" name="myId" value="@Model.Id" />
                </div>
            </li>
            <li class="k-state-active">

                <span>Activities Data</span>
                <div class="rootRow">

                    <section id="Activities">
                        @{Html.RenderPartial("~/Areas/Path/To/Views/WizardStep1/_Activities.cshtml", Model.DataWizard); }

                    </section>
                </div>
            </li>

            <!-- and more li items -->
       </ul>
    </div>
</form>

@section Scripts{
<script>
    $(document).ready(function () {
      $("#panelBarExample").kendoPanelBar({
          expandMode: "multiple",
          activate: function(e){
              // #scheduler is a kendoScheduler
              if(e.sender.select().find('#scheduler').length > 0)
                  if($('#scheduler').getKendoScheduler() != null)
                      $('#scheduler').getKendoScheduler().refresh();
          }
      });
    });

       // More functions here

       function saveDataAndReturnPreviousView() {
           var form = $("form#myForm");
           form.attr("action", "@Url.Action("SaveDataAndReturnPreviousView","myController")");
           form.submit();
        }

        // More functions here

</script>
}

例如,UI 具有以下外观:

在此处输入图像描述

我的控制器

    [HttpPost]
    public ActionResult SaveDataAndReturnPreviousView(customDTO myDto)
    {
        //  Do some stuff            

        //  Redirect to the correct view
        return RedirectToAction(<action name here>,<controller name here>, <route values here>);            
    }

当在视图上单击按钮时,将调用 saveDataAndReturnPreviousView 函数(请参阅上面这段 javascript 代码中的此函数)。然后在控制器上调用相应的动作 SaveDataAndReturnPreviousView,最后我在那里做一些事情并重定向以显示另一个视图。

这是正常工作,除非在我单击按钮之前展开“常规数据”面板。总之,这就是正在发生的事情:

  1. 如果“常规数据”面板展开它不起作用,则到达并执行表单提交 (form.submit()) 的 javascript 行代码,但控制器中的 SaveDataAndReturnPreviousView 操作永远不会执行。
  2. 如果“常规数据”面板被折叠,那么它可以工作,这里没有问题。它的行为符合预期。

在这两种情况下,其他面板的状态(展开或折叠)都无关紧要。唯一的问题是第一个面板,当它展开时它不起作用。

那么有什么想法在案例1中发生这种奇怪的行为吗?

在 Google Chrome DevTools 中,控制台中没有错误。

2021 年 2 月 25 日更新

看来问题来自部分视图_View1.cshtml。无论是第一个面板、第二个还是第三个面板等等,如果这个面板包含部分视图_View1,则表单提交失败,Google Chrome DevTools 控制台中不会显示错误消息。

我已经准确检测到部分视图的哪一行导致表单提交不起作用。

下面一行是 _View1.cshtml 中的罪魁祸首:

//@Html.WfTextBoxFor下面是System.Web.Mvc.HtmlHelper的扩展方法,//看本帖后面

@Html.WfTextBoxFor(x => x.numeroHora, new { @class = "k-textbox", @style = "width:100%" })

注意:x.numeroHora 是十进制类型?并且我确保它不为空,在这种情况下它的值为 1,5(符号 ',' 是西班牙语格式的十进制符号)

我已将 x.numeroHora 更改为另一个不是小数的字段?例如字符串或 int,它可以工作,然后表单提交可以工作,但是当这个字段是十进制类型时?这没用。问题似乎是当字段是十进制类型时?任何其他类型都可以成功运行。在视图中,我还有其他 @Html.WfTextBoxFor 项目,哪些字段不是十进制类型?并且他们都成功地工作。当我评论代码行 @Html.WfTextBoxFor(x => x.numeroHora, new { @class = "k-textbox", @style = "width:100%" } 然后表单提交工作。

此外,@Html.WfTextBoxFor 是在静态类中定义的 System.Web.Mvc.HtmlHelper 的扩展方法:

namespace My.MVC.Helpers
{
    public static class WfHtmlExtensions
    {
        public static MvcHtmlString WfTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
        {
            bool bEditable = htmlHelper.IsWfEditable(expression);
            bool bVisible = htmlHelper.IsWfVisible(expression);

            return htmlHelper.TextBoxFor<TModel, TValue>(expression, htmlAttributes, bEditable, bVisible); // This calls method below
        }

        public static MvcHtmlString TextBoxFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object htmlAttributes, bool editable, bool bVisible)
        {
            MvcHtmlString html = default(MvcHtmlString);

            RouteValueDictionary routeValues = htmlAttributes == null ? new RouteValueDictionary() : new RouteValueDictionary(htmlAttributes);
            AddWfAttributesClass(routeValues, !editable, !bVisible);
            html = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, routeValues);

            return html;
        }
    }
}

当类型为十进制时,有关如何解决此问题的任何想法?

System.Web.Mvc.HtmlHelper 是 5.2.7.0 版本(我已经安装了 Microsoft.AspNet.Mvc 和 Microsoft.AspNet.Mvc.es 版本 5.2.7.0 nuget 包)

2021 年 1 月 3 日更新

我已经使用 Telerik Fiddler Web Debugger 分析了网络流量,它没有显示任何内容,没有流量,只是网页挂起,没有调用控制器方法。

Telerik Fiddler Web 调试器截图:

在此处输入图像描述

标签: javascriptjqueryasp.net-mvckendo-uikendo-panelbar

解决方案


推荐阅读