web-dev-qa-db-ja.com

UserControl(.ascx)でASP.NET WebMethodを呼び出す方法

WebMethodを(UserControl用の)ascx.csファイルに配置し、クライアント側のjQueryコードから呼び出すことは可能ですか?

何らかの理由で、WebMethodコードを.asmxまたは.aspxファイルに配置できません。

例:ArticleList.ascx.csには次のコードがあります。

[WebMethod]
public static string HelloWorld()
{
    return "helloWorld";
}

ArticleList.ascxファイルには、次のようにWebMethodの呼び出しがあります。

$.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            data: "{}",
            dataFilter: function(data)//makes it work with 2.0 or 3.5 .net
            {
                var msg;
                if (typeof (JSON) !== 'undefined' &&
                typeof (JSON.parse) === 'function')
                    msg = JSON.parse(data);
                else
                    msg = eval('(' + data + ')');
                if (msg.hasOwnProperty('d'))
                    return msg.d;
                else
                    return msg;
            },
            url: "ArticleList.ascx/HelloWorld",
            success: function(msg) {
                alert(msg);
            }
        });

また、firebugからのエラーは次のとおりです。

<html>
<head>
    <title>This type of page is not served.</title>

クライアント側のjQueryコードからサーバー側のWebMethodを正常に呼び出すにはどうすればよいですか?

39
gruber

WebMethodは静的である必要があります。したがって、ユーザーコントロールに配置し、ページにメソッドを追加して呼び出すことができます。

編集:

Webメソッドはページ内に自動的にレンダリングされるため、ユーザーコントロールを介してWebメソッドを呼び出すことはできません。

ユーザーコントロールにあるWebメソッド:

public static string HelloWorld()
{
    return "helloWOrld";
}

Pageクラスで、Webメソッドを追加します。

[WebMethod]
public static string HelloWorld()
{
    return ArticleList.HelloWorld(); // call the method which 
                                     // exists in the user control
}
31
Homam

メソッドは.aspx内にある必要があります(または.ashxまたは.asmxも機能すると思います)。実際にWebサーバーへの新しい呼び出しを行うため、IISは要求を処理する必要があり、IISは.ascxファイルへの呼び出しに応答しません。

11
Joe Enos

Jquery Ajaxを使用して、ユーザーコントロールでメソッドを直接呼び出すことはできません。

ただし、次のアプローチのいずれかを試すことができます。

  • URLをPageName.aspx?Method=YourMethodに設定するか、他の制限を追加して、どのユーザーコントロールがメソッドを実行する必要があるかを確認します。その後、ユーザーコントロールで、クエリ文字列内の制限の存在を確認し、指定されたメソッドを実行できます。

  • 非同期で何かをする必要がある場合は、クライアントコールバックを使用して何らかのメソッドを実行することができます。ページのGetCallbackResultで、コールバックの原因となったコントロールを検索し、その引数とともにリクエストをコントロールに渡すことができます。

8
Erik Dekker

この問題に出くわし、Dekker、Homan、Gruberのソリューションを組み合わせて使用​​しました。すべてのクレジットはそれらになります。

ユーザーがチェックボックスをクリックしたときにセッションを変更できるようにする必要がありました。ページメソッドは静的である必要があるため、ページメソッド内でできることは限られているため、セッションを変更できませんでした。そこで、jQueryを使用して、必要な作業を行うWebサービスメソッドを呼び出したユーザーコントロールの親ページで静的メソッドを呼び出しました。

ユーザーコントロールのJavascript .ascxファイル

function chkSelectedChanged(pVal) {
    //called when user clicks a check box
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: '{ "p1":' + pVal+' }',
        url: "ParentPage.aspx/StaticPageMethod",
        success: function (msg) {
            //alert('it worked');
        },
        error: function (msg) {
            alert('boom' + msg);
        }
    });
}

。aspx.csファイルの背後の親ページコード

[WebMethod]
    public static void StaticPageMethod(string pVal)
    {
        var webService = new GridViewService();
        webService.GridCheckChanged(pVal);
    }

Webサービス.asmx

[WebService(Namespace = "")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class GridViewService : System.Web.Services.WebService
{
    [WebMethod]
    public void GridCheckChanged(string pVal)
    {
       //Do Work
    }
}
2
Josh Allen

Webmethodでそのようにできます

Dim uc As UserControl = New UserControl()
Dim objSummarycontrol As SummaryControl = uc.LoadControl("~/Controls/Property/SummaryControl.ascx")
Dim propertyId As String = SessionManager.getPropertyId()
objSummarycontrol.populateTenancyHistory(propertyId)
1
user2061951

ユーザーコントロールからWebMethodにアクセスすることはできませんが、機能を実行することはできます。

  1. 1つの単純なWebページ(aspx)を作成します。
  2. Webpage(aspx.cs)にwebmethodを記述します。
  3. Webページからのアクセス方法。
0
Rohit Dodiya

Aspxでの登録の制御:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CustomerRequirements.aspx.cs" EnableViewState="true" Inherits="Bosch.RBNA.CustomerRequirementsServerWeb.Pages.CustomerRequirements" %>

<%@ Register TagPrefix="pp" Src="~/Pages/PeoplePicker.ascx" TagName="PeoplePicker"%>

Aspxの使用を制御します。

<div class="form-group">
    <label for="exampleInputPassword1">Contact to get permisson</label>
    <pp:PeoplePicker runat="server" ID="peoplePicker" ClientIDMode="Static"></pp:PeoplePicker>
</div>

jQuery AJAX Call:

$.ajax({
    type: "POST",
    url: CustomerRequirements.aspx/GetPeoplePickerData + "?SearchString=" + searchText + "&SPHostUrl=" + parent.GetSpHostUrl() + "&PrincipalType=" + parent.GetPrincipalType() + (spGroupName? "&SPGroupName=" + spGroupName: ""),
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {
        parent.QuerySuccess(queryIDToPass, msg.d);
    },
    error: function (response) {
        var r = jQuery.parseJSON(response.responseText);
        alert("Message: " + r.Message);
        alert("StackTrace: " + r.StackTrace);
        alert("ExceptionType: " + r.ExceptionType);
        parent.QueryFailure(queryIDToPass);
    }

});

コードビハインドメソッド:

[System.Web.Services.WebMethod]
public static string GetPeoplePickerData()
{
    try
    {
        return PeoplePicker.GetPeoplePickerData();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

コントロールの背後にあるコード:

[WebMethod]
public static string GetPeoplePickerData()
{
    try
    {
        //peoplepickerhelper will get the needed values from the querystring, get data from sharepoint, and return a result in Json format
        Uri hostWeb = new Uri("http://ramsqlbi:9999/sites/app");
        var clientContext = TokenHelper.GetS2SClientContextWithWindowsIdentity(hostWeb, HttpContext.Current.Request.LogonUserIdentity);
        return GetPeoplePickerSearchData(clientContext);
    }
    catch (Exception ex)
    {

        throw ex;
    }
}
0
Jaydeep Shil