1

Synapse のコンテンツ管理システムを使用している VS 2008 (.Net 3.5) Web サイトに機能を追加する必要があります。何時間も苦労した後、ゼロから始めて、次の作業を新しい Web プロジェクトで行いました。

クライアント側のスクリプトと html は次のとおりです。

<script type="text/javascript">
function ClickedIt() {
    $.ajax({
        type: "POST",
        url: "Default.aspx/FromClient",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            alert(msg.d);
        }
    });
} // ClickedIt
function ClickedItDeeper() {
    $.ajax({
        type: "POST",
        url: "/Deeper/ActionsController.aspx/FromClient",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            alert(msg.d);
        }
    });
} // ClickedItDeeper
</script>

<asp:Button ID="btnClickMe" runat="server" Text="Click Me - Server" />&nbsp;&nbsp;
<asp:Button ID="btnViaClient" runat="server" Text="Click Me - Client" OnClientClick="ClickedIt(); return false;" />&nbsp;&nbsp;
<asp:Button ID="btnDeeper" runat="server" Text="Click Me - Deeper" OnClientClick="ClickedItDeeper(); return false;" />

さらに良いことに、VB で記述しなければならないので、呼び出している 2 つの異なるテストを次に示します。1 つは私が実行している実際のページ (Default.aspx) で、もう 1 つはメソッドをまとめるための方法 (ActionsController.aspx) です。

Imports System.Web.Services

  Partial Public Class _Default
  Inherits System.Web.UI.Page

Protected Sub btnClickMe_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnClickMe.Click
    Me.lblResult.Text = "From the Server Side: " + DateTime.Now.ToString()
End Sub

<WebMethod()> _
Public Shared Function FromClient() As String
    Return "Via the Client: " + DateTime.Now.ToString()
End Function

End Class

ActionsController は次のとおりです。

Imports System.Web.Services

Partial Public Class ActionsController
Inherits System.Web.UI.Page

<WebMethod()> _
Public Shared Function FromClient() As String
    Return "Via the Deeper Client: " + DateTime.Now.ToString()
End Function

End Class

上記のすべては、その孤立したサイトでチャンピオンのように機能します. しかし、この CMS サイトで同じことをしようとすると、parseerror: 無効な文字が表示されます。そこにある多くの記事を見た後(修正されたものはありません)、おそらくテレリックまたはCMSソフトウェアでさえJSON.parseを上書きしていると言及していましたが、そうであったようです. もう一方を使用しないように強制し、現在はjson2.jsを使用しています。私が置くとき:

alert(text);

json2.js ファイルのすぐ内側:

JSON.parse = function(text, reviver) {

HTMLページのコンテンツ全体が表示されます。これは、これを呼び出したときに見つからないページです。

$.ajax({
type: "POST",
url: "ActionsController.aspx/FromClient",
data: "{}",
contentType: "application/json",
dataType: "json",
success: function(msg) {
    $("#lblResult").html(msg);
    alert("success");
},
error: function(xhr, textStatus, errorThrown) {
    alert("Ajax error on " + this.url +
        "\nStatus: " + textStatus +
        "\nError: " + errorThrown +
        "\nText: " + xhr.statusText +
        "\nxhrStatus: " + xhr.status
    );
}
});

SyntaxError: JSON.parse のエラーが表示されますが、テキスト値は OK でステータスは 200 です。

先頭の / を持たないように URL を変更し、最初に en-US を追加しましたが、先頭のスラッシュの有無にかかわらず、すべて役に立ちませんでした。見つからないページが合法かどうかはわかりません。最初、ActionsController ページはフォルダにありました。それ以来、サイトのルートに移動しました。

これは、私がVS2010で何度も行ったことです。それはVS2008で動作しますが、何かが邪魔になっていて、URLに何かを添付するか、このCMSのおかげで何かを付けていると思います. エラーが発生した場合は、 /ActionsController.aspx/FromClient である this.url を渡してくれるので、うまくいきます。

壊れたサイトの実際の ActionsController コードは次のとおりです。

Imports System.Web.Services

Partial Public Class ActionsController
Inherits System.Web.UI.Page

<WebMethod()> _
 Public Shared Function FromClient() As String
    Return "Via the Deeper Client: " + DateTime.Now.ToString()
End Function

<WebMethod()> _
Public Shared Function Multiply(ByVal Input As Integer) As String
    Return "Via the Deeper Client: " + DateTime.Now.ToString()
End Function

End Class

あと 1 時間で、テレリックやシナプスの「機能」のレイヤーとレイヤーの下におそらく非常に単純であるが隠されているものを検索し、微調整し、テストするだけの丸一日になります。

私の一日を作ってください!

4

1 に答える 1

0

さて、開発者と少し話をした後、私はそれを理解するのに十分な情報を得ることができました. それを機能させるために私がしなければならなかった基本的に2つのことがありました。1 つは、Global.asax ファイルの BeginRequest をオーバーライドしてから、web.config にいくつかの値を追加する必要があったことです。

他の誰かがこのような問題に遭遇した場合に備えて、ここに完全な結果があります.

.aspx ページの jQuery ajax 呼び出しは次のとおりです。

function LoadAllScannedDocumentCounts() {
    var labels = $("[data-DocumentFolder]");

    $.each(labels, function(index, label) {
        var ComplaintNumber = $(this).attr("data-DocumentFolder");
        $(this).prepend("<img id='spinImage" + ComplaintNumber + "' src='/ComplaintsReports/Images/spinner.gif' />");

        $.ajax({
            url: "/Exclusions/ActionsController.aspx/GetScannedDocumentCount",
            type: "POST",
            data: "{ " +
                    "       'ComplaintNumber': '" + ComplaintNumber + "'" +
                " }",
            contentType: "application/json",
            dataType: "json",
            success: function(data) {
                $(label).text(data.d);

                if (data.d > 0)
                    $(label).addClass("badge badge-info");
                else
                    $(label).addClass("badge");
            }, // Success
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert("Error: " + errorThrown + "\nURL: " + this.url);
            } // Error
        }); // Ajax
    }); // foreach of the checked check boxes
} // LoadAllScannedDocumentCounts - Method

web.config の追加:

<system.web.extensions>
    <scripting>
        <webServices>
            <authenticationService enabled="true" />
        </webServices>
    </scripting>
</system.web.extensions>

Global.asax ファイル:

System.Web.SessionState をインポートします

Public Class Global_asax
Inherits SynapseBaseSite46.Global

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.BeginRequest
    Dim app As HttpApplication = DirectCast(sender, HttpApplication)
    Dim con As HttpContext = app.Context

    ' Skip any calls to the ActionsController
    If (Not con.Request.FilePath.ToLower().Contains("exclusions/actionscontroller.aspx")) Then
        MyBase.Application_BeginRequest(sender, e)
    End If
End Sub

End Class

そして最後に、WebMethods を含む「ActionsController」ページ:

Imports System.Web.Services
Imports System.IO

Partial Public Class ActionsController
Inherits System.Web.UI.Page

<WebMethod()> _
 Public Shared Function GetScannedDocumentCount(ByVal ComplaintNumber As String) As Integer
    Dim Result As Integer = 0
    Dim SearchPath As String = ConfigurationManager.AppSettings("ScannedImagesShare") & "\"

    Try
        For Each dir As DirectoryInfo In New DirectoryInfo(SearchPath & ComplaintNumber.Replace("-", "")).GetDirectories()
            Dim files As FileInfo() = dir.GetFiles("*.pdf")
            Result += files.Count()
        Next
    Catch dex As DirectoryNotFoundException
        ' do nothing
    Catch ex As Exception

    End Try

    Return Result
 End Function

End Class
于 2013-04-11T14:58:53.493 に答える