Какой самый простой способ вызвать метод C # из Javascript - PullRequest
2 голосов
/ 18 февраля 2010

У меня есть элемент управления LinkButton, к которому мне нужно добавить метод c #. В настоящее время, когда я использую контроль синтаксического анализа и добавляю элемент управления на страницу, он изменяет вызов javascript, и я получаю неопределенное значение. Я думаю, что можно обойти это путем определения функции javascript, которая будет вызывать метод c # из кода, но я не могу понять, как это сделать.

В частности, когда нажимается кнопка ссылки Мне нужен JavaScript, чтобы передать идентификатор кнопки ссылки методу C # .

Я пробовал это:

foreach (Control Control in myctrl.Controls)
           {
              if (Control is LinkButton)
                   {
                      LinkButton lb = (LinkButton)Control;
                      lb.Click += LinkButton_Click;

                    }
              Panel1.Controls.Add(myctrl);
           } 



public void LinkButton_Click(Object sender, EventArgs e)
        {
   BREAKPOINTHERE>         Console.Write(e.ToString());

        }

Никогда не срабатывает при нажатии. вот сгенерированный код:

<a id="dnn_ctr954_ViewPromotions_LinkButton2" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;dnn$ctr954$ViewPromotions$LinkButton2&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">Get your Free 2</a>

Теперь, если я добавлю это на мою страницу aspx, все будет работать нормально:

 <asp:LinkButton ID="test" OnClick="LinkButton_Click" runat="server">mybutton</asp:LinkButton>

Я получил это, и он отлично работает:

<a id="dnn_ctr954_ViewPromotions_test" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;dnn$ctr954$ViewPromotions$test&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">mybutton</a>

Ответы [ 5 ]

7 голосов
/ 18 февраля 2010

Вы не можете сделать это per se.Javascript существует на клиенте.Код C # существует на сервере.Они не могут иметь никаких контекстуальных знаний друг о друге.Код сервера запускается в ответ на запрос HTTP.

При этом вы можете создать метод веб-службы в C # и вызывать его с помощью javascript.Судя по контексту вашего вопроса, он может не делать то, что вы хотели бы.Методы веб-службы являются статическими и не имеют того же контекста, что и обычная обратная передача.

Однако вы можете ознакомиться с несколькими статьями, подобными этой: Вызовы веб-службы на стороне клиента с расширениями Ajax

Редактировать: С вашим редактированием звучит так, будто вы просто хотите отправить кнопку обратно на сервер.Это основная функциональность ASP.Net, и ее легко сделать.Как показывают другие ответы, вам просто нужно подключить обработчик событий щелчка в коде вашего сервера.

4 голосов
/ 18 февраля 2010

Вы можете вызвать WebService или PageMethod из JavaScript, написанного на C #.

Обновление: поскольку вы используете LinkButton, вы можете просто определить обработчик кликов в своем коде:

button.Click += button_Click
1 голос
/ 18 февраля 2010

Пример: загрузка запроса страницы из серверной части через ajax. ПРИМЕЧАНИЕ Предполагается, что используется jQuery ... просто образец

/ ************ c #код ************************ /

   [WebMethod]
    public static nameValue[] GetPageQueryList()
    {
        HttpRequest q = myRequest;
        NameValueCollection n = q.QueryString;
        List<nameValue> thisList = new List<nameValue>();

        if (n.HasKeys())
        {
            for (int i = 0; i < n.Count; i++)
            {
                nameValue newList = new nameValue(n.GetKey(i), n.Get(i));
                thisList.Add(newList);
            };
        }
        else
        {
            nameValue r = new nameValue("", "");
            thisList.Add(r);
        };
        return thisList.ToArray();
    }

#region nameValue
public class nameValue
{
    /// <summary>
    /// web service/webmethod needs 0 parameter constructor
    /// </summary>
    public nameValue()
    {
    }
    public nameValue(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public string Name;
    public string Value;

}
#endregion

/ ******************************* код JavaScript *************** /

// set the Query options from ajax results 

function testLoadQuery(jdata)
{
    var options = '';
    for (var i = 0; i < jdata.length; i++)
    {
        if (jdata[i].Name === "PID")
        {
            queryPatientID = jdata[i].Value;
        }
        options += '<option value="' + jdata[i].Name + '">' + '(' + jdata[i].Name + ')' + jdata[i].Value + '</option>';
    };
    $("select.requestSelect").html(options);
};
// read  on page load
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        dataFilter: function(data)
        {
            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: "MyFancyPage.aspx/GetPageQueryList",
        success: function(msg)
        {
            testLoadQuery(msg);
            $("#testonlyRequest").text("Yeah QueryList did load");
        },
        failure: function(msg)
        {
            $("#testonlyRequest").text("oh darn QueryList did not load");
        }
    });

/********************** the html sample *******************/
    <div class="testonlyRequestContainer">
        <div class="testonly" id="testonlyRequest">
            testonlyRequest</div>
        <select class="testrequestSelect" id="testrequestSelect" title="request stuff">
        </select>
    </div>
0 голосов
/ 18 февраля 2010

В инструментарии моей компании мы внедрили технологию, которую мы называем удаленный вызов . Он состоит из двух частей - на стороне клиента есть метод javascript RemoteInvoke (), который принимает имя метода и массив аргументов для передачи в метод. На стороне сервера вы украшаете открытый метод, который вы хотите вызвать, с помощью атрибута [RemoteInvokable]. RemoteInvoke сопоставляет сигнатуру как можно лучше (введите приведение типа, если необходимо), а затем вызвал соответствующий открытый метод (если он нашел один).

Это не для таких простых вещей, как щелчок, но если вам нужны более сложные вещи, он будет работать просто замечательно.

0 голосов
/ 18 февраля 2010

Вы ищете WebMethods, здесь есть пример с jquery , но его можно легко адаптировать к базовому javascript. Хороший соус в разделе "PageMethods.SomeMethod".

...