在iPad上动态渲染局部视图

时间:2013-08-16 21:13:01

标签: ipad jquery-mobile asp.net-mvc-4 razor ios6

我真的希望有人可以提供帮助。我刚刚在当前项目中遇到了一大障碍,只打了另一个。我的截止日期快到了,所以任何建议都会非常感激。

我正在使用MVC4和Jquery Mobile为iPad开发移动应用程序。在我的应用程序中的某个点,用户将触发一个弹出框,其中包含“是”和“否”按钮。如果用户单击“是”,我想将一些参数发送到我的控制器中的操作,执行一些数据库工作,然后返回将在我的主视图中显示的部分视图(具有更新的模型)。我有以下jquery,点击弹出窗口中的href按钮后执行。

    $(function () {
        $("#popupSubmit").bind("tap", tHandler);

        function tHandler(event) {
            $.post('@Url.Action("LoadTestData", "WO")', 
            {TestKey: lblTestKey.innerHTML, TestRequestNumber: lblTestServiceRequestNum.innerHTML }, 
            function (data) { $('#detailsDiv').html(data); $('#detailsDiv').trigger("create"); });
          }
    });

在上面的代码中,#popupSubmit是href按钮,LoadTestData是一个返回局部视图的Action,WO是Controller,#detailsDiv是主视图中的占位符div。 TestKey和TestRequestNumber是必须传递给Action的参数。下面是Action,LoadTestData的代码。 _ShowTestPartial是部分视图。

    [HttpPost]
    public ActionResult LoadTestData(string TestKey, string TestRequestNumber)
    {
       //do database work
       return PartialView("_ShowTestPartial", model);
    }

现在,所有这些代码都可以在我的Safari桌面上运行。但是,这不适用于iPad。我已经测试了,当在iPad上点击按钮时代码确实进入了tHandler事件,但是有一些关于URL.Action的内容或关于以这种方式返回部分视图,而iPad就是不喜欢的。

有谁知道如何为iPad解决这个问题?

编辑(评论中的其他信息):要清楚,部分视图在iPad上根本没有渲染,但它在桌面Safari上(在Chrome中也是如此)。我尝试用“pagecreate”替换“create”,但这实际上剥夺了桌面浏览器中的JQM样式,并且没有改变iPad的任何内容。

在我放置绑定功能的地方似乎也没关系......我已经尝试过它作为一个单独的功能。我在.ready()和.on('pageinit')中尝试过。在所有这些情况下,它适用于桌面Safari和Chrome,但不适用于iPad。

另外,正如我之前所说,.bind(“tap”)适用于iPad。我已经通过在tHandler中放入其他代码进行了测试。但是。$ post中的某些内容在iPad上无效。

谢谢奥马尔以及任何有任何想法的人。欢迎所有人!

编辑#2:根据奥马尔的建议,我将我的功能移到$(文件).on('pageinit')。我还在$ .post上添加了错误捕获。更新了以下代码:

    $(document).on('pageinit', function () {         
        $("#popupSubmit").bind("tap", tHandler);

        function tHandler(event) {
            $.post('@Url.Action("LoadTestData", "WO")', { TestKey: lblTestKey.innerHTML, TestRequestNumber: lblTestRequestNum.innerHTML })
            .done(function (data) { $('#detailsDiv').html(data); $('#detailsDiv').trigger("create"); })
            .fail(function (xhr, textStatus, errorThrown) { alert(xhr.responseText); })
        }
    });

幸运的是,这使我能够看到iPad上发生的错误。不幸的是,来自$ .post的错误是“处理您的请求时发生了未知错误”。使用此代码,桌面浏览器上的所有内容仍然可以顺利运行。

1 个答案:

答案 0 :(得分:0)

事实证明答案是,在iPad上,参数没有传递给$ .post。 lblTestRequestNum和lblTestKey是我的JQM弹出对话框中的标签。见下文:

    <div data-role="popup" id="popupDialog" data-overlay-theme="a" data-theme="b" data-dismissible="false"
        style="max-width:416px;" class="ui-corner-all">

            <div data-role="header" data-theme="a" class="ui-corner-top">
                <h1>Selection <label id="lblTestRequestNum" style="text-align:left;  height:22px; font-size:14px;">@Model.TestRequestNumber</label></h1>
            </div> 
            <div data-role="content" data-theme="a" class="ui-corner-bottom ui-content">      
                <h3 class="ui-title" style="text-align:center; height:22px;">Are you sure?</h3>                             
                <label id="lblTestKeyLabel" style="text-align:left;  height:22px; font-size:14px; margin-left:95px;">Test Key: </label>                  
                <label id="lblTestKey" style="text-align:left;  height:22px; font-size:14px;"></label>  
                <label id="lblTestType" style="text-align:left;  height:22px; font-size:14px; margin-left:95px;"></label>                   
                <a id="popupSubmit" data-role="button" data-inline="true" data-rel="back"
                data-mini="true" data-theme="b" style="width:150px;" type="submit">Yes</a>
                <a href="#" data-role="button" data-inline="true" data-rel="back" 
                    data-mini="true" data-transition="flow" data-theme="b" style="width:150px;">No</a> 
            </div> 

    </div>

在桌面上,Safari能够从弹出窗口中的标签中检索我需要的参数。但在iPad上却无法实现。所以,我只是在弹出窗口外面找到了一些位置,在我的主视图中显示/检索我的参数。获得的经验教训:不要指望iPad能够从弹出式对话框中的标签/输入中读取任何内容。