6

iOS6.0を実行している第3世代iPadのSafariブラウザーで実行されているASP.NETWebアプリケーションで、断続的な問題の原因を特定するのに非常に苦労しています。場合によっては、<a>JavaScriptを介してポストバックを実行するハイパーリンクとして設定されたタグが突然機能を停止し、画面上でそれらに触れても何も実行されないように見えることがあります。これらには、ログアウトリンクとして設定されたasp:LinkBut​​tonコントロール、および行の並べ替えを許可するように設定されたGridViewのヘッダー行が含まれます。その背後には韻や理由がないようです-しばらくは通常どおりに動作し、その後停止します。後で再び動作を開始することに気付きます(ほとんどの場合、Safariを閉じて再度開いた後ですが、常にそうとは限りません)動作するようです)。

ログアウトコントロールは、aspxファイルでは次のようになります。

<asp:LinkButton ID="LogoutButton" onclick="LogoutButton_Click" runat="server">[ Logout ]</asp:LinkButton>

結果のHTMLでは次のように表示されます。

<a id="LogoutButton" href="javascript:__doPostBack(&#39;ctl00$LogoutButton&#39;,&#39;&#39;)">[ Logout ]</a>

iPadで実行されているSafariについて、ページや他の開いているブラウザタブに読み込まれるデータが多すぎる、またはこのシナリオで動作しているViewStateの何かなど、そのようなリンクがときどき壊れないようにする特別なものはありますか?iPadでWebアプリケーションをしばらく遊んだ後でも、問題を再現するための特別な方法が見つからないため、問題を修正することすらできないので、本当にイライラするので、探しています。 ASP.NETアプリを開発し、iPadやSafari環境をよく知っている人からのガイダンス。デスクトップブラウザでこの問題が発生したことはありません。

更新: iPadのSafariに疑似ソースの表示オプションを追加する方法についてこのページで概説されているトリックを使用して、ポストバックリンクが機能しているページの生成されたHTMLの違いを確認できるようになりました。停止したページ。つまり、 ASP.NETが通常ページに埋め込む__doPostBack JavaScript関数は、何らかの理由で埋め込まれなくなるだけです。その結果、リンクに関連付けられたJavaScriptは単にエラーになります。ポストバックリンクを機能させるために、ASP.NETが通常ページに追加するものは次のとおりです。

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

これは、 AppleサポートフォーラムおよびここSOで説明されているのと同じ問題のようです。後者は、ASP.NETがiPad上のSafariをJavaScript対応として認識できないことがあり、そのため__doPostBack関数をページに適切に挿入しない可能性があることを示唆しています。ただし、私のページの他のJavaScriptはまだ正常に機能しているため、問題を完全に説明することはできません。

4

4 に答える 4

7

ほぼ同じ問題でStackOverflowでこの質問を見つけた後、Stephenによって提案されたbrowserCaps出力ページを実行し、iPadのホーム画面のリンクからフルスクリーンモードで実行すると、ASP.NETサーバーに次のように表示されることがわかりました。一般的な、機能のないブラウザ。私は、Avada Kedavraによって提案された修正を他の質問に適用しました。これには、次のことを含める必要がありました。

<browserCaps userAgentCacheKeyLength="256" />

...<system.web>私のweb.configファイルのセクションに、そしてこれも:

protected void Page_PreInit(object sender, EventArgs e)
{
   if (Request.UserAgent != null && Request.UserAgent.IndexOf("AppleWebKit", StringComparison.CurrentCultureIgnoreCase) > -1)
   {
      this.ClientTarget = "uplevel";
   }
}

動作していたメインWebページのコードビハインドファイル。 他の人の修正のソースであるJasonKealeyも、彼の調査結果のコメントセクションで、ASP.NETWebアプリケーションのApp_Browsersフォルダーにある.browserファイルにこれを追加することも役立つ可能性があることを示唆しています。

<browsers>
  <browser refID="Mozilla" >
    <capabilities>
      <capability name="cookies"  value="true" />
      <capability name="type" value="Uplevel" />
    </capabilities>
  </browser>

  <browser refID="Default">
    <capabilities>
      <capability name="cookies" value="true" />
      <capability name="type" value="Uplevel" />
    </capabilities>
  </browser>
</browsers>

編集: この修正をアプリケーションに適用しましたが、他の領域が壊れました。具体的には、ChromeとSafariが「上位」として識別されていたため、他の領域で「IE」として検出されました。以下のコードにより、この修正は、ユーザーエージェントでSafariとして識別されていない場合にのみiDeviceに適用されます。

string ua = Request.UserAgent;
if (ua != null
    && (ua.IndexOf("iPhone", StringComparison.CurrentCultureIgnoreCase) >= 0
    || ua.IndexOf("iPad", StringComparison.CurrentCultureIgnoreCase) >= 0
    || ua.IndexOf("iPod", StringComparison.CurrentCultureIgnoreCase) >= 0)
    && ua.IndexOf("Safari", StringComparison.CurrentCultureIgnoreCase) < 0)
{
    this.ClientTarget = "uplevel";
}
于 2012-10-10T20:32:21.553 に答える
0

このSO投稿も同様であり、ページ出力キャッシュが有効になっている場合に発生する可能性があると述べています。

asp.net:__doPostBackがいつかレンダリングされない

OutputCacheを使用していますか?

于 2012-10-10T16:59:28.460 に答える
0

iOS7のAppMode(フルスクリーンモード)でUmbracoを実行しているサイトで同じ問題が発生したため、上記のすべての提案を試しましたが、役に立ちませんでした。ただし、デフォルトのブラウザに追加された、上記のRegexidentの回答のわずかな拡張が、うまくいくように思われることがわかりました。

<capability name="jscriptversion"       value="5.6" />
<capability name="javascript"           value="true" />
<capability name="javascriptversion"    value="1.5" />

Aristosによる元の投稿をチェックしてください

これが私と同じようにさらに役立つことを願っています。

于 2013-10-09T11:15:09.797 に答える
0

以下の定義をApp_Browsersフォルダーの下のブラウザーファイルに配置しましたが、完全に機能しました。��

<browsers>
  <browser id="safariiphone" parentID="mozilla">
    <identification>
      <userAgent match="AppleWebKit"/>
    </identification>
    <capabilities>
      <capability name="version"                         value="${version}" />
      <capability name="majorversion"                    value="${major}" />
      <capability name="minorversion"                    value="${minor}" />
      <capability name="type"                            value="Safari${major}" />
      <capability name="ecmascriptversion"               value="3.0" />
      <capability name="javascript"                      value="true" />
      <capability name="javascriptversion"               value="1.6" />
      <capability name="w3cdomversion"                   value="1.0" />
      <capability name="tagwriter"                       value="System.Web.UI.HtmlTextWriter" />
      <capability name="cookies"                         value="true" />
      <capability name="frames"                          value="true" />
      <capability name="javaapplets"                     value="true" />
      <capability name="supportsAccesskeyAttribute"      value="true" />
      <capability name="supportsCallback"                value="true" />
      <capability name="supportsDivNoWrap"               value="false" />
      <capability name="supportsFileUpload"              value="true" />
      <capability name="supportsMaintainScrollPositionOnPostback" value="true" />
      <capability name="supportsMultilineTextBoxDisplay" value="true" />
      <capability name="supportsXmlHttp"                 value="true" />
      <capability name="tables"                          value="true" />
    </capabilities>
  </browser>

</browsers>
于 2014-01-28T17:13:07.210 に答える