【问题标题】:Dynamically rendering partial view on iPad在 iPad 上动态渲染局部视图
【发布时间】:2013-08-16 21:13:01
【问题描述】:

我真的希望有人可以提供帮助。我刚刚克服了当前项目中的一个大障碍,却又遇到了另一个障碍。我的最后期限快到了,因此非常感谢任何建议。

我正在使用 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 的参数。下面是动作 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 解决这个问题吗?

编辑(来自 cmets 的附加信息):需要明确的是,部分视图根本不会在 iPad 上呈现,而是在桌面 Safari 上(以及在 Chrome 中)。我尝试用“pagecreate”替换“create”,但这实际上取消了桌面浏览器中的 JQM 样式,并且没有改变 iPad 的任何内容。

我将绑定函数放在哪里似乎也无关紧要......我已经尝试将它作为一个单独的函数。我已经在 .ready() 和 .on('pageinit') 中尝试过。在所有这些情况下,它都适用于桌面版 Safari 和 Chrome,但不适用于 iPad。

另外,正如我之前所说,.bind("tap") 可以在 iPad 上运行。我已经通过将其他代码放入 tHandler 中进行了测试。但是 .$post 中的某些内容在 iPad 上不起作用。

感谢 Omar 以及其他任何有想法的人。欢迎大家!

编辑 #2:根据 Omar 的建议,我将函数移至 $(document).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 的错误是“处理您的请求时发生未知错误”。使用此代码,一切仍可在桌面浏览器上顺利运行。

【问题讨论】:

  • 这是一个重复的问题,如果有,请删除一个。新内容不是增强了吗?究竟发生了什么?截图将不胜感激。重要提示:不要在 JQM 中使用 $(function).ready()
  • @Omar 尊敬的先生,这不是一个重复的问题(至少如果您谈论的是我自己写的问题)。昨天我自己回答的问题让我明白了这一点,现在这是一个不同的问题(即,现在它可以在桌面上运行,我如何让它在 iPad 上运行)。就正在发生的事情而言,部分视图根本没有加载到 iPad 上。您对用什么替换 $function 和 .ready() 有什么建议吗?请注意,此时 $function 不在 .ready() 中。
  • 我的错,我在看到答案之前发表了评论。你用的是什么版本?正如我在之前的评论中提到的,不要使用 .ready 并尝试将您的代码绑定到 pageinit$(document).on('pageinit', function () { code });。并尝试pagecreate 而不是create。 JQM 很棘手,因此 反复试验 是你最好的朋友。
  • 只是想补充一点,在我之前的问题中,$(function) 在 .ready() 中。但不是现在。功能是分开的。事实上,我的代码发生了一些变化,我正在采取不同的方法。编辑:刚刚看到你的第二条评论。我会尝试这些事情并回复你。
  • $(function() { }); 等价于 .ready()pageinit 是专门为 JQM 制作的。

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


【解决方案1】:

答案是,在 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 能够从弹出对话框中的标签/输入中读取任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多