Подтвердить что ты не робот

Как вызвать метод ASP.NET С# с использованием javascript

Кто-нибудь знает, как вызвать метод С# на стороне сервера, используя javascript? Что мне нужно сделать, так это остановить импорт, если выбрано "Отмена" или продолжить импорт, если выбрано "ОК". Я использую visual studio 2010 и С# в качестве своего lanaguage программирования

Это мой код:

private void AlertWithConfirmation()            
{                 
    Response.Write(
        "<script type=\"text/javascript\">" +     
            "if (window.confirm('Import is currently in progress. Do you want to continue with importation? If yes choose OK, If no choose CANCEL')) {" +     
                "window.alert('Imports have been cancelled!');" +     
            "} else {" +   
                "window.alert('Imports are still in progress');" +     
            "}" +      
        "</script>");   
}
4b9b3361

Ответ 1

PageMethod более простой и быстрый подход для Asp.Net AJAX Мы можем легко улучшить работу пользователей и производительность веб-приложений, развязав мощь AJAX. Одна из лучших вещей, которые мне нравятся в AJAX, - это PageMethod.

PageMethod - это способ, с помощью которого мы можем выставить метод боковой страницы сервера в java script. Это приносит так много возможностей, что мы можем выполнять множество операций, не используя медленные и раздражающие сообщения.

В этом сообщении я показываю основное использование ScriptManager и PageMethod. В этом примере я создаю форму регистрации пользователя, в которой пользователь может зарегистрировать свой адрес электронной почты и пароль. Вот разметка страницы, которую я собираюсь разработать:

<body>
    <form id="form1" runat="server">
    <div>
        <fieldset style="width: 200px;">
            <asp:Label ID="lblEmailAddress" runat="server" Text="Email Address"></asp:Label>
            <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
            <asp:Label ID="lblPassword" runat="server" Text="Password"></asp:Label>
            <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox>
        </fieldset>
        <div>
        </div>
        <asp:Button ID="btnCreateAccount" runat="server" Text="Signup"  />
    </div>
    </form>
</body>
</html>

Чтобы настроить метод страницы, сначала перетащите менеджер script на свою страницу.

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>

Также обратите внимание, что я изменил EnablePageMethods="true".
Это скажет ScriptManager, что я буду называть PageMethods с клиентской стороны.

Теперь следующий шаг - создать функцию Server Side.
Вот функция, которую я создал, эта функция проверяет ввод пользователя:

[WebMethod]
public static string RegisterUser(string email, string password)
{
    string result = "Congratulations!!! your account has been created.";
    if (email.Length == 0)//Zero length check
    {
        result = "Email Address cannot be blank";
    }
    else if (!email.Contains(".") || !email.Contains("@")) //some other basic checks
    {
        result = "Not a valid email address";
    }
    else if (!email.Contains(".") || !email.Contains("@")) //some other basic checks
    {
        result = "Not a valid email address";
    }

    else if (password.Length == 0)
    {
        result = "Password cannot be blank";
    }
    else if (password.Length < 5)
    {
        result = "Password cannot be less than 5 chars";
    }

    return result;
}

Чтобы сообщить менеджеру script, что этот метод доступен через javascript, нам нужно обеспечить две вещи:
Первый: этот метод должен быть "public static". Второй: должен существовать тег [WebMethod] выше, как указано в приведенном выше коде.

Теперь я создал функцию на стороне сервера, которая создает учетную запись. Теперь мы должны называть его с клиентской стороны. Вот как мы можем вызвать эту функцию с клиентской стороны:

<script type="text/javascript">
    function Signup() {
        var email = document.getElementById('<%=txtEmail.ClientID %>').value;
        var password = document.getElementById('<%=txtPassword.ClientID %>').value;

        PageMethods.RegisterUser(email, password, onSucess, onError);

        function onSucess(result) {
            alert(result);
        }

        function onError(result) {
            alert('Cannot process your request at the moment, please try later.');
        }
    }
</script>

Для вызова метода на стороне сервера Зарегистрируйте пользователя, ScriptManager создает прокси-функцию, доступную в PageMethods.
У моей функции на стороне сервера есть два параметра: электронная почта и пароль, после этих параметров мы должны дать еще два имени функции, которые будут выполняться, если метод успешно выполнен (первый параметр, т.е. onSucess) или метод не работает (второй параметр, т.е. результат).

Теперь все кажется готовым, и теперь я добавил OnClientClick="Signup();return false;" в мою кнопку "Регистрация". Итак, вот полный код моей страницы aspx:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
        </asp:ScriptManager>
        <fieldset style="width: 200px;">
            <asp:Label ID="lblEmailAddress" runat="server" Text="Email Address"></asp:Label>
            <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
            <asp:Label ID="lblPassword" runat="server" Text="Password"></asp:Label>
            <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox>
        </fieldset>
        <div>
        </div>
        <asp:Button ID="btnCreateAccount" runat="server" Text="Signup" OnClientClick="Signup();return false;" />
    </div>
    </form>
</body>
</html>

<script type="text/javascript">
    function Signup() {
        var email = document.getElementById('<%=txtEmail.ClientID %>').value;
        var password = document.getElementById('<%=txtPassword.ClientID %>').value;

        PageMethods.RegisterUser(email, password, onSucess, onError);

        function onSucess(result) {
            alert(result);
        }

        function onError(result) {
            alert('Cannot process your request at the moment, please try later.');
        }
    }
</script>

Ответ 2

Вам нужно будет сделать вызов Ajax, который я подозреваю. Ниже приведен пример вызова Ajax, созданного jQuery, чтобы вы начали. Код регистрируется пользователем в моей системе, но возвращает bool относительно того, был ли он успешным или нет. Обратите внимание на атрибуты ScriptMethod и WebMethod метода, расположенного ниже.

в разметке:

 var $Username = $("#txtUsername").val();
            var $Password = $("#txtPassword").val();

            //Call the approve method on the code behind
            $.ajax({
                type: "POST",
                url: "Pages/Mobile/Login.aspx/LoginUser",
                data: "{'Username':'" + $Username + "', 'Password':'" + $Password + "' }", //Pass the parameter names and values
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: true,
                error: function (jqXHR, textStatus, errorThrown) {
                    alert("Error- Status: " + textStatus + " jqXHR Status: " + jqXHR.status + " jqXHR Response Text:" + jqXHR.responseText) },
                success: function (msg) {
                    if (msg.d == true) {
                        window.location.href = "Pages/Mobile/Basic/Index.aspx";
                    }
                    else {
                        //show error
                        alert('login failed');
                    }
                }
            });

В коде позади:

/// <summary>
/// Logs in the user
/// </summary>
/// <param name="Username">The username</param>
/// <param name="Password">The password</param>
/// <returns>true if login successful</returns>
[WebMethod, ScriptMethod]
public static bool LoginUser( string Username, string Password )
{
    try
    {
        StaticStore.CurrentUser = new User( Username, Password );

        //check the login details were correct
        if ( StaticStore.CurrentUser.IsAuthentiacted )
        {
            //change the status to logged in
            StaticStore.CurrentUser.LoginStatus = Objects.Enums.LoginStatus.LoggedIn;

            //Store the user ID in the list of active users
            ( HttpContext.Current.Application[ SessionKeys.ActiveUsers ] as Dictionary<string, int> )[ HttpContext.Current.Session.SessionID ] = StaticStore.CurrentUser.UserID;

            return true;
        }
        else
        {
            return false;
        }
    }
    catch ( Exception ex )
    {
        return false;
    }
}

Ответ 3

Я собираюсь идти прямо вперед и предлагаю решение с помощью jQuery, а это значит, что вам нужно будет импортировать библиотеку, если вы еще не...

Импортируйте библиотеку jQuery в свою разметку страницы:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>

Затем создайте другой файл *.js script (я вызываю my ExecutePageMethod, так как это единственный метод, который он будет раскрывать) и импортирует его:

<script type="text/javascript" src="/ExecutePageMethod.js" ></script>

Вновь добавленный файл добавьте следующий код (я помню, как вы его вытаскивали из другого места, так что кто-то заслуживает доверия за него):

function ExecutePageMethod(page, fn, paramArray, successFn, errorFn) {
    var paramList = '';
    if (paramArray.length > 0) {
        for (var i = 0; i < paramArray.length; i += 2) {
            if (paramList.length > 0) paramList += ',';
            paramList += '"' + paramArray[i] + '":"' + paramArray[i + 1] + '"';
        }
    }
    paramList = '{' + paramList + '}';
    $.ajax({
        type: "POST",
        url: page + "/" + fn,
        contentType: "application/json; charset=utf-8",
        data: paramList,
        dataType: "json",
        success: successFn,
        error: errorFn
    });
}

Затем вам необходимо увеличить свой метод .NET-страницы с помощью соответствующих атрибутов:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string MyMethod()
{
    return "Yay!";
}

Теперь, в пределах вашей разметки страницы, в блоке script или из другого файла script, вы можете вызвать метод, например:

ExecutePageMethod("PageName.aspx", "MyMethod", [], OnSuccess, OnFailure);

Очевидно, вам нужно реализовать методы OnSuccess и OnFailure.

Чтобы использовать результаты, скажем, в методе OnSuccess, вы можете использовать метод parseJSON, который, если результаты становятся более сложными (например, в случае или возвратом массива типов), этот метод будет анализировать его в объекты:

function OnSuccess(result) {
    var parsedResult = jQuery.parseJSON(result.d);
}

Этот код ExecutePageMethod особенно полезен, поскольку он повторно используется, поэтому вместо того, чтобы управлять вызовом $.ajax для каждого метода страницы, который вы, возможно, захотите выполнить, вам просто нужно передать страницу, имя метода и аргументы этот метод.

Ответ 4

Jayrock RPC library - отличный инструмент для этого в приятной семейной жизни для разработчиков С#. Он позволяет вам создать класс .NET с требуемыми вами методами и добавить этот класс в качестве script (на круговой основе) на вашу страницу. Затем вы можете создать объект js вашего типа и вызвать методы, как и любой другой объект.

Он по сути скрывает реализацию ajax и представляет RPC в формате familliar. Имейте в виду, что лучшим вариантом является использование ASP.NET MVC и использование jQuery ajax-вызовов для методов действий - гораздо более краткими и менее беспорядочными!

Ответ 5

Существует несколько вариантов. Вы можете использовать атрибут WebMethod для своей цели.