Вызов функции C # из JavaScript / JQuery в веб-формах Asp.net - PullRequest
3 голосов
/ 16 сентября 2011

Итак, у меня есть страница aspx, которая выглядит так:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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>

    </div>
    </form>
</body>
</html>

Я хотел бы знать, как я могу написать код JavaScript (например, jQuery), который будет вызывать функцию из моего кода C #. Допустим, это мой метод C #:

protected void XXX(object sender, EventArgs e)
{
    Response.Redirect("pagewho?");
}

Еще раз спасибо, Алон. :)

EDIT:

Это полный код, который я использую в данный момент:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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>
  <script type="text/javascript">
      validateStuff = function () {
          var isValid = true;
          var txt = document.getElementById("TextBox1");

          if (txt) {
              if (txt.value.toLower() != "james") {
                  isValid = false;
              }
          }
          //perform validation and return true/false
          return isValid;
      }

  </script>
    <form id="form1" runat="server">
    <div>
    <asp:Button ID="Button1" runat="server" OnClientClick="return validateStuff();" OnClick="Button1_Click" />
        <br />
        <br />
        <asp:TextBox ID="TextBox1" runat="server" Height="25px" Width="135px"></asp:TextBox>
        <br />
        <br />
        <br />
    </div>
    </form>
</body>
</html>

но, независимо от того, что я отправляю в текстовое поле, оно возвращает true. любая помощь?

Ответы [ 5 ]

6 голосов
/ 16 сентября 2011

Вы можете использовать __doPostBack из скрипта и использовать метод RaisePostBackEvent в коде для выполнения логики на стороне сервера. Если вы хотите сделать перенаправление, это, вероятно, будет лучшим способом.

EDIT

Если вы хотите выполнить некоторую проверку в JavaScript при нажатии кнопки, используйте OnClientClick для выполнения проверки JavaScript и верните true, если проверка прошла успешно.

<asp:Button ID="Button1" runat="server" OnClientClick="return validateStuff();" OnClick="Button1_Click" />

Ваша проверка JavaScript:

validateStuff = function(){
    var isValid = true;
    var txt = document.getElementById("<%=TextBox1.ClientID%>");
    if (txt.value.toLower() != "james"){
       isValid = false;
    }        
    return isValid;
}

Если функция validateStuff возвращает значение true, происходит обратная передача, и вы можете обрабатывать логику сохранения / обновления в событии нажатия кнопки:

protected void Button1_Click(object sender, EventArgs e)
{
    //save some stuff to the database

    string txtValue = TextBox1.Text.Trim();
}

В JavaScript:

redirectToAnotherPage = function(){
    __doPostBack("<%=SomeServerControl.ClientID%>", "someArgument");
}

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

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
    //call the RaisePostBack event 
    base.RaisePostBackEvent(source, eventArgument);

    Response.Redirect("anotherpage.aspx");
}

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

redirectToAnotherPage = function(){
    window.location.href = "somepage.aspx";
}
5 голосов
/ 16 сентября 2011

Чтобы код на стороне клиента вызывал код на стороне сервера, вам, вероятно, нужно использовать AJAX .Поскольку вы упоминаете jQuery, у него есть очень удобная функция для выполнения этого вызова.Но выполнение вызова из JavaScript - это только половина дела, вам также понадобится что-то на сервере, прослушивающее этот вызов.Если вы собираетесь использовать jQuery (в отличие от других опций, таких как AJAX Toolkit ), тогда я рекомендую не размещать метод «на странице», а использовать его как собственный ресурс.Я рекомендую использовать HttpHandler для ответа на вызовы AJAX.

Ключевой момент, который следует помнить, заключается в том, как это структурно отличается от простой отправки обратно на страницу.Используя AJAX, эти вызовы происходят на странице асинхронно.Итак, первое, что вы должны знать, это то, что Response.Redirect() не будет работать в этом случае.Он будет перенаправлять вызов AJAX, а не текущую открытую страницу.Могут быть способы использования методологий постбэк в ASP.NET, но я должен спросить ... если все, что вы делаете, это перенаправление, то почему бы просто не сделать это на стороне клиента?JavaScript вполне способен на это.Вы можете легко перенаправить с сервера на постбэк, но изнутри JavaScript почему бы просто не сделать так, чтобы JavaScript делал это?

3 голосов
/ 16 сентября 2011

Вы можете вызвать метод C #, сделав его webmethod.Смотрите этот URL: http://www.xdevsoftware.com/blog/post/Call-WebMethod-from-Javascript-in-ASPNET.aspx в Javascript это вызов метода страницы.

Но для вашего примера я бы предложил вам просто предварительно заполнить значение pagewho?использование тегов asp.net, когда HTML отображается как asp .net.

Пример (в javascript):

GoToLink("<%= YourCodeBehindMethodReturingURLToPutHere() %>");

Ссылка: http://weblogs.asp.net/ahmedmoosa/archive/2010/10/06/embedded-code-and-inline-server-tags.aspx

2 голосов
/ 16 сентября 2011

Один из способов вызова метода C # из клиента с использованием JavaScript - это использование webmethods .

. Вам необходимо определить публичный статический метод в вашем коде и добавитьк нему атрибут [ WebMethod ].

В этом примере я использовал WebMethod, который возвращает текущую дату и время в виде строки с сервера:

[WebForm1.aspx.cs]

using System;
using System.Web.Services;

namespace TemplateWebMethod
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        [WebMethod]
        public static string MyMethod()
        {
            return DateTime.Now.ToString();
        }
    }
}

В форме страницы aspx необходимо добавить asp: ScriptManager с EnablePageMethods = "true" :

[WebForm1.aspx]

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="TemplateWebMethod.WebForm1" %>

<!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>
    <script type="text/javascript">
      // during onload we set the onclick method of our button
      // to call MyMethod from the server
      window.onload = function(){
        document.getElementById('Button1').onclick = function() {
          PageMethods.MyMethod(myMethodCallBackSuccess, myMethodCallBackFailed);
        }
      }

      function myMethodCallBackSuccess(response) {
          // JavaScript code that will run
          // after MyMethod was run successfully on server
          // respose is the returned value of MyMethod
          alert(response);
      }

      function myMethodCallBackFailed(error) {
          alert(error.get_message());
      }
    </script>
</head>
<body>
    <form id="form1" runat="server">
      <asp:ScriptManager runat="server" EnablePageMethods="true" />
      <asp:Button runat="server" ID="Button1" ClientIDMode="Static" Text="Call MyMethod" UseSubmitBehavior="false" />
    </form>
</body>
</html>

Для Button1:

ClientIDMode = "Static" используется, поэтому у Button1 будет одинаковый идентификатор на стороне клиента, и мы сможем найтиэто легко при добавлении на стороне клиента onclick.

UseSubmitBehavior = "false" требуется, чтобы нажатие кнопки не вызывало полную обратную передачу.

В этом примереWebMethod MyMethod будет вызываться из codebehind нажатием кнопки Button1, поэтому мы устанавливаем поведение onclick для Button1 on window.onload:

window.onload = function(){
  document.getElementById('Button1').onclick = function() {
    PageMethods.MyMethod(myMethodCallBackSuccess, myMethodCallBackFailed);
  }
}

Где:

PageMethods.MyMethod(myMethodCallBackSuccess, myMethodCallBackFailed);

- это метод JavaScript, который вызывает код на стороне сервера.

Нам нужно определить его 2 метода обратного вызовадля успеха и неудачи.

В случае успеха мы выскакиваем сообщение с возвращенным значением из MyMethod:

function myMethodCallBackSuccess(response) {
    alert(response);
}

При ошибке мы выскакиваем сообщение с сообщением об ошибке:

function myMethodCallBackFailed(error) {
    alert(error.get_message());
}
0 голосов
/ 16 сентября 2011
<head id="Head1" runat="server">
<script type="text/javascript">

    function checking() {
        var firstTwoChar = document.getElementById('TextBox1').value.substr(0, 2); //getting first two chars
        if (firstTwoChar == 'ok') { //if it starts with 'ok', submit the form to server
            document.forms['form1'].__OK.value = 1; // everything's OK, let the server know it, by writing 1 to hidden input field 
            document.forms['form1'].submit(); // submits to server
        }
        else {
            alert('thats not OK'); //form is not submited, alerting client about the error
        }
}

</script>
<title> </title>
</head>
<body>
<form id="form1" runat="server">
<input type="hidden" name="__OK" id="__EVENTARGUMENT" value="">
<input id="Button111" type="button" value="button" onclick="checking()" />
<asp:TextBox  ID="TextBox1" runat="server"></asp:TextBox>
</form>
</body>
</html>

как для кода

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        string ok = Request.Form["__OK"]; //getting data from hidden input
        if (ok == "1") // if it's 1 checking succeeded, thus it's ok to save data 
        insertTextBoxValueintoDBTable(TextBox1.Text); //saving data
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...