2015-07-24 1 views
1

Я создаю несколько LinkButtons динамически на странице ASP с помощью MasterPage. В отдельном файле JavaScript у меня есть функция JS, которая меняет текст LinkButton при нажатии, то есть «Да» на «Нет» и наоборот. Это своего рода кнопка «Мне нравится». Поэтому обязательно, чтобы страница оставалась неподвижной, когда люди щелкают по LinkButton (будет раздражать, если нет). Метод C# с параметрами должен выполняться при нажатии LinkButton.Вызов метода C# (используя PageMethod) из LinkButton без обратной передачи (сайт MasterPage)

добавить это свойство щелчок на LinkButton, чтобы использовать метод, который находится в отдельном C# класса файла:

MyLinkButton.Click += (sender, e) => { MyClass.MyClick(par1, par2); }; 

Но дело в том, что если я добавить следующее свойство, чтобы предотвратить постбэк и сохранить нет страницы статические, когда LinkButton щелкают:

MyLinkButton.Attributes.Add("href", "javascript:;"); 

Он больше не работает метод MyClick в файле MyClass.

Таким образом, я попытался вызвать метод MyClick из кода JS, который меняет «Да» на «Нет» при нажатии с помощью PageMethod.

В MyClass я добавил: ссылку на System.Web.Services и положить [WebMethod] выше метода государственной статической силы MyClick(). Также добавлен ScriptManager в мой файл MasterPage внутри тела/формы и задан атрибут EnablePageMethods = "true".

Проблема заключается в том, с или без («HREF», «JavaScript :;») атрибут установлен на LinkButton, то PageMethod не вызывая метод MyClick в файле MyClass. Я попытался следующие два способа:

PageMethods.MyClick(par1, par2) 

и

PageMethods.MyClass.MyClick(par1, par2) 

И оба не инициирующие метод. Я ценю любые комментарии или предложения.

+0

добавить [WebMethod] только для метода. –

+0

Прочтите мое сообщение более тщательно, это уже сделано. – user

ответ

3

То, как кнопка ссылка работает есть, его href указывает на метод __doPostBack JavaScript , Это вызывает отправку сообщения на сервер. Поскольку вы заменили href на javascript:, по существу «ничего не делайте», это объясняет поведение, которое вы видите.

Если вы хотите отправить данные на сервер без перезагрузки страницы, вам необходимо использовать AJAX. Существует два основных метода: один из них - UpdatePanel, большинство людей, включая меня, будут рекомендовать против этой модели. Зачем? Хорошо подумайте об этом так, основываясь на том, что вы мне говорите, у вас есть кнопка «как». Я бы предположил, что вам нужны две части данных, которые нужен вашему серверному методу, некоторый идентификатор, чтобы определить, что им нравится, и логическое выражение типа или не нравится. Если вы используете UpdatePanel, весь ViewState должен совершить кругооборот на сервере. Кроме того, сервер будет отвечать всем содержимым HTML всего в UpdatePanel. Есть много хороших статей в Интернете, которые более подробно, вот one, если вам интересно, но я подвел итоги. Если вы пытаетесь создать легкий, быстрый современный веб-сайт, это не путь. Если вы пытаетесь быстро сделать что-то и не хотите писать JavaScript, возможно, однако JavaScript является в значительной степени требованием для современной сети.

В качестве альтернативы вы можете использовать прямой AJAX. Это требует, чтобы вы поместили метод в свой код, украшенный атрибутом [WebMethod]. Это означает, что теперь он может быть вызван из JavaScript через AJAX. Используя мой пример, вы должны:

Как вы это называете. Я бы рекомендовал использовать фреймворк, такой как jQuery, для вызова AJAX, поскольку он упрощает синтаксис для вас. С помощью JQuery, вы можете просто сделать:

$.ajax({ 
    type: "GET", 
    url: "MyPage.aspx/DoLike", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: { id: "123", likeOrNotLike: true }, 
    success: function (msg) { 
     alert("It was called successfully"); 
    }, 
    error: function() { 
     alert("An error occurred calling it"); 
    } 
}); 

Код выше посылает два параметра метода DoLike, "123" (идентификатор), и верно (likeOrNotLike). Вы будете вызывать метод с такими параметрами, как если бы вы вызвали его из C#. Эта структура полностью учитывает это.

Чтобы добавить Jquery на страницу, просто добавьте:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script> 

Если вы против JQuery, я могу изменить свой ответ, чтобы использовать XMLHTTPRequest непосредственно, но это более громоздким.

Как вы можете видеть, AJAX не волшебство, но вы не можете просто добавить [WebMethod] к вашему обработчику событий, и все будет работать. Фактически, если вы идете по прямому маршруту AJAX, вы даже не используете обработчик событий, вы вызываете метод на стороне сервера напрямую.

Вы, безусловно, можете сделать UpdatePanel, как предложили некоторые другие, он будет работать. Это просто, в моем и многих других мнениях, излишнее для AJAX. Это была попытка Microsoft внедрить AJAX без участия разработчика. Как и в случае с ViewState, он поставляется с ценой. Это зависит от вас, если цена будет приемлемой.

+0

Ваш ответ был замечательный. Я не против решения JS/jQuery, и перед тем, как перейти к UpdatePanel, я попробую вашу рекомендацию. Я пытаюсь поместить вызов ajax в сценарий «Да» «Нет», где мне кажется более логичным. Дело в том, что я не уверен, как точно определить URL-адрес метода MyClick, в отдельном файле MyClass, в вызове ajax. Элемент управления «Like» по-прежнему является LinkButton. Не тратя много времени, можете ли вы просто указать мне в правильном направлении? – user

+0

Я смог заставить его работать после вашего предложения. Мне кажется прекрасным решением. Как вы думаете, это может быть недостатком этого маршрута вместо пути UpdatePanel. Просто для закрытия по этому вопросу, для будущих читателей (и для меня). – user

0

мои 2 цента: Я думаю, это потому, что вы пытаетесь запустить код сервера, не отправляя необходимую информацию на сервер. Без обратной передачи вы не можете ожидать, что сервер обработает событие. Не уверен, есть ли способ сделать это в ASP. Возможно, вы могли бы использовать вызов AJAX, но я никогда не использовал его для этой конкретной цели.

+0

Я вижу вашу точку зрения, но не должен ли это также дать мне какую-то ошибку? Для того, что я читал, проблема также может быть связана с тем, что это страница в файле MasterPage или, возможно, вызов PageMethods или метод MyClick, находящийся в отдельных файлах Class/JS? – user

+0

Зачем вы хотите получить сообщение об ошибке? ваш href: javascript говорит «ничего не делать», который преуспевает отлично, он ничего не делает. – dman2306

+0

как я сказал в своем посте, без атрибута javascript href, он ничего не делает. – user

0

Если вы хотите позвонить на сервер без обратной передачи, вы должны использовать UpdatePanel или собственную функцию Ajax. В вашем случае, я считаю, что UpdatePanel самый приятный.

Поместите свои поля и кнопку внутри UpdatePanel, тогда все будет нормально работать, точно так же, как магия.

Чтобы увидеть, как использовать UpdatePanel, посмотрите на

https://msdn.microsoft.com/en-us/library/bb386454.aspx

http://www.4guysfromrolla.com/articles/102407-1.aspx

http://ajax.net-tutorials.com/controls/updatepanel-control/

Смежные вопросы