【问题标题】:Jquery UI tabs switch on submit event (asp.net MVC 3) returning JSON to final TabJquery UI 选项卡打开提交事件(asp.net MVC 3)将 JSON 返回到最终选项卡
【发布时间】:2012-05-31 19:18:35
【问题描述】:

我有一个带有 jqueryUI 选项卡的页面。我有 3 个标签。前两个选项卡有两个单独的表单 您可以提交一个或另一个,但不能同时提交。当您提交一个表单时,第三个选项卡会打开,其中包含来自回发的提交结果。我有点不确定我会怎么做?到目前为止,这是我的选项卡控件...

<script type="text/javascript">
    $(function () {
        $("#searchPatient").tabs();
    });
</script>
<div id="searchPatient" style="display:inline; float:inherit">
    <ul>
        <li><a href="#searchByMRN">Search By MRN</a></li>
        <li><a href="#searchByDemographics">Search By Demo</a></li>
        <li><a href="#retTable">Return Table</a></li>
    </ul>
    @Html.Partial("_SearchByMRN")
    @Html.Partial("_SearchByDemographic")
    @Html.Partial("_RetTable")


</div>

如您所见,我的设置很简单。这些 Partial 调用中的每一个都有部分视图,其中包含选项卡的 div。我猜在这个页面上的脚本中,我需要禁用传统的提交功能,而只显示第三个选项卡(retTable)。不确定我需要寻找什么活动?关于如何开始这方面的任何想法?有类似的例子吗?

更新: 下午好,先生。此选项卡控件完美运行,但我正在尝试扩展它... 我想将 JSON 数据发送回 retTable,并在最后一个选项卡中附加一个表...我想如果我更改了我的 Controller 方法以将 JSON 返回到页面...

public ActionResult SearchByMRN(SearchByMRNModel searchByMRN)
        {

            //Have to flesh this out more... Will return JSON result set back to SearchPatient View
            //Can pull right out of old project... Shouldn't be a major problem...
            //ImportPopulationManagementDLL's      
            string UID = HttpContext.User.Identity.Name;
            DataRepository dr = new DataRepository();
            List<SelectListItem> retVal = dr.SearchByMRN(searchByMRN, UID);
            return Json(DataRepository.searchPatientJSonStr(retVal), JsonRequestBehavior.AllowGet);// PartialView("_RetTable");
        }

我在渲染的原始视图中有这个脚本(调用 .tabs() 函数的那个​​)

<script type="text/javascript">
    $(function () {
        $("#searchPatient").tabs();
    });
    function switchToResultTab(data) {
        $('a[href="#retTable"]').click();
        debugger;
        $("#list").setGridParam({
            datatype: 'jsonstring',
            datastr: data,
            caption: 'Patient Search Result'
        }).trigger("reloadGrid");
    }

    function failToTab(data) {
        alert("");
        $("list").setGridParam({
        datatype:'jsonstring',
        caption: 'Patient Search Result',
        datastr:data
        }).trigger("reloadGrid");
    }
</script>

我认为这会很简单,但不知何故,ajax 函数只是一直要求我保存 JSON 文件......我觉得这只是一个痛苦。 另外,在调用 Ajax.BeginForm 时,您将如何获得加载 gif... 我敢打赌有一个加载字段。让我仔细检查一下……

【问题讨论】:

  • 您还有其他问题吗?你的问题解决了吗?如果是这样,请将问题标记为已回答或提供更多信息,如果您需要进一步的说明。
  • 我相信一切都如我所愿。我会标记我认为最能帮助我的回答。
  • 我迷失在你的代码中。函数setGridParam() 在哪里?它的参数发生了什么。你现在的看法如何?为什么你要返回一个 json 结果?您不认为只针对您的新问题创建一个新问题会是更好的选择吗?
  • setGridParam() 是 jqGrid 的一部分。我有一个网格,我正在尝试用 JSON 数据填充......此时我希望我可以让我的函数调用......我现在正在写另一个问题,我认为这个问题更多重点。
  • stackoverflow.com/q/11544133/729820 请查看我的新问题。我会很感激你的意见。我束手无策......似乎我的解决方案在金钱上是正确的......但我显然错过了一些东西

标签: asp.net-mvc-3 jquery-ui


【解决方案1】:

将你的两个表单放在 Ajax.BeginForm 中:

@using (Ajax.BeginForm("SearchByMRN",
                       "SearchController",
                       new AjaxOptions
                       {
                           HttpMethod = "POST",
                           InsertionMode = InsertionMode.Replace,
                           UpdateTargetId = "retTable",
                           OnSuccess = "switchToResultTab()"
                       },
                       new
                       {
                           id = "formSearchByMRN"
                       }))
{
    @*Form content goes here*@
    <button id="btnFormSearchByMRN" type="submit">Search<button>
}

编辑

这将呈现以下 HTML 输出:

<form method="post" id="formSearchByMRN" data-ajax-update="#retTable" data-ajax-success="switchToResultTab()"
data-ajax-mode="replace" data-ajax-method="POST" data-ajax="true" action="/SearchController/SearchByMRN" novalidate="novalidate">...</form>

当帖子成功完成时,将调用 OnSuccess-Method。

控制器动作:

[HttpPost]
public ActionResult SearchByMRN(Searchmodel searchmodel)
{
    /* Perform serach */

    return PartialView("_RetTable");
}

为您的第二个搜索表单再次执行上述操作。

MVC 会将结果标签内容替换为搜索结果,然后您需要一个 javaScript 函数来成功切换标签:

function switchToResultTab() {
    $('a[href="#retTable"]').click();
}

【讨论】:

  • 这是一个有趣的观点。我从未使用过 Ajax.Begin 表单... OnSuccess 选项是什么?我猜 new{id="formSearchByMRN"} 将是表单的 id?
  • 我明白了。 OnSuccess 是对您稍后定义的函数的调用。
  • 我明白了。 OnSuccess 是对您稍后定义的函数的调用。我注意到你的 'a[href="#retTab;e"]'
  • 我的控制器不应该返回某种 JSON 结果吗?
  • 哎呀,写得很快,我更正了我的答案并更新了一些更多信息。 Ajax.BeginForm 在 MVC 中是一个非常强大的工具,你应该对它有更深的了解。我会用 Html.BeginForm 为你提供第二个可能的答案
【解决方案2】:

如果我没记错的话,您可以从 URL 中选择 jQuery UI 选项卡。如果您浏览到同一页面,但在页面 URL 中添加了哈希 #retTable,则将选择“返回表”选项卡。所以如果页面 URL 是 localhost/Patient/Search,则可以使用 localhost/Patient/Search#retTable 打开第三个标签页。

由于您需要在回发中执行此操作,因此表单的操作应包含哈希。这是一个关于如何做到这一点的示例:ASP.NET MVC - Post form to html bookmark?

【讨论】:

    【解决方案3】:

    第二个答案

    将你的两个表单放在 Html.BeginForm 中:

    @using (Html.BeginForm("SearchByMRN",
                           "SearchController",
                           FormMethod.Post,
                           new
                           {
                               id = "formSearchByMRN"
                           }))
    {
        @*Form content goes here*@
        <button id="btnFormSearchByMRN" type="submit">Search<button>
    }
    

    控制器动作:

    [HttpPost]
    public ActionResult SearchByMRN(Searchmodel searchmodel)
    {
        /* Perform serach */
    
        return PartialView("_RetTable");
    }
    

    为您的第二个搜索表单再次执行上述操作。

    通过 ajax 提交表单:

    $('#formSearchByMRN, #searchByDemographics').submit(function () {
        if ($(this).valid()) {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    $('#retTable').html(result);
                    switchToResultTab();
                }
            });
        }
        return false;
    });
    
    
    function switchToResultTab() {
        $('a[href="#retTable"]').click();
    }
    

    但我更喜欢我之前使用 Ajax.BeginForm 的答案,这对我来说似乎更舒服。

    【讨论】:

    • 假设我想通过 JSON 将 JSON 数据返回到第三个选项卡?你会怎么做?我一直在尝试,我似乎无法破解密码?
    • 看来我的 jquery 没有被加载???因为我的电话 t0.valid 不起作用。
    • 上述方法没有得到正确的动作,也不会序列化表单。我一次又一次地尝试了一千种不同的方法。我不能采取正确的行动并序列化数据...如果您在同一页面上基本上有两个表单。你是怎么做到的?
    • 你的问题到处都是,这让我觉得你没有尽职尽责。通过简单的搜索,我可以找到关于 SO 的每个问题的多个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多