Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Изменение where в LINQ / 22 сообщений из 22, страница 1 из 1
22.03.2013, 17:18
    #38195243
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Хочу изменить построенную визардом реализацию, чтобы при изменении значения текстбокса производился отбор записей аналогично
Код: sql
1.
SELECT * FROM tClient WHERE Name1 Like @Name + '%'



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="DataClassesDataContext" 
        Select="new (Name1, Name2, Name3, BirthDay, DocSerial, DocNumber)" 
        TableName="tClients" OrderBy="Name1, Name2, Name3" 
        AutoGenerateWhereClause="True" 
        <WhereParameters>
                <asp:ControlParameter ControlID="TextBox1" Name="Name1" PropertyName="Text" Type="String" />
       </WhereParameters>
</asp:LinqDataSource>



Убрал WherePartameters и AutoGenerateWhereClause и попробовал перехватывать событие текстбокса TextChaged и прописывать что-то типа
Код: c#
1.
        LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + TextBox1.Text + "\")";



Это нормальный подход?
Как в WhereParameters засунуть?
...
Рейтинг: 0 / 0
22.03.2013, 17:38
    #38195295
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Код: plaintext
1.
Where="Name1.StartsWith(@Name)"
...
Рейтинг: 0 / 0
25.03.2013, 12:08
    #38197101
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Продолжаем разговор...
Сейчас для серверного TextBox в событии TextChanged изменяется значение LinqDataSource.Where.
В UpdatePanel лежит ListView, привязанный к LinqDataSource.
TextBox лежит не в UpdatePanel, но для панели прописан триггер на TextBox.

Хочу, чтобы данные обновлялись (выполнялся запрос) не только по триггеру или по серверному TextChanged, а по onkeyup на клиенте.
Как из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола?

Сделал по подобию примера из http://msdn.microsoft.com/ru-ru/library/ms178210(v=vs.90).aspx
В итоге я вижу, что при вводе в текстовое поле производится вызов серверного метода (отображается предупреждение), а вот обновление данных в UpdatePanel/ListView не происходит. Что сделал не так? Есть ли еще какие-либо более лаконичные или правильные способы?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
...
  <script type="text/ecmascript">
    function LookUp()
    {
        CallServer(document.getElementById("TextBox1").value, "");
    }
    function ReceiveServerData(rValue)
    {   
        document.getElementById("WarnSpan").innerHTML = rValue;

    }
  </script>
...
                <asp:TextBox ID="TextBox1" runat="server" Width="210px" onkeyup="LookUp();" ></asp:TextBox>
                <span id="WarnSpan"></span> 
...



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler 
{
    protected System.Collections.Specialized.ListDictionary catalog;
    protected String returnValue;

    protected void Page_Load(object sender, EventArgs e)
    {
        String cbReference =  Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
        String callbackScript;

        callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + ";}";
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(),  "CallServer", callbackScript, true);
    }
    public void RaiseCallbackEvent(String eventArgument)
    {
        if (eventArgument.Length > 4)
        {
            LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + eventArgument + "\")";
            UpdatePanel1.Update();
            returnValue = "";
        }
        else
        {
            returnValue = "Длина строки поиска должна быть больше 4 символов.";
        }
    }
    public String GetCallbackResult()
    {
        return returnValue;
    }
    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + TextBox1.Text + "\")";
    }
}
...
Рейтинг: 0 / 0
25.03.2013, 12:19
    #38197124
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
RemКак из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола? http://api.jquery.com/jQuery.post/
...
Рейтинг: 0 / 0
25.03.2013, 12:28
    #38197140
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Rem,

.. а для ListView не надо DataBind() вызывать при апдейте?
...
Рейтинг: 0 / 0
25.03.2013, 12:32
    #38197154
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
carrotikRem,

.. а для ListView не надо DataBind() вызывать при апдейте?

А надо?
В исходном варианте с TextChanged и без DataBind() работало.
...
Рейтинг: 0 / 0
25.03.2013, 12:34
    #38197157
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
ПаганельRemКак из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола? http://api.jquery.com/jQuery.post/

Это более кошерный вариант? Или просто один из вариантов?
...
Рейтинг: 0 / 0
25.03.2013, 12:36
    #38197170
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Rem,

...я не уверен, поскольку с LinqDataSource не имел дело .. С обычным дейтасорсом - это обычное дело ...
...
Рейтинг: 0 / 0
25.03.2013, 12:40
    #38197177
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
RemПаганельпропущено...
http://api.jquery.com/jQuery.post/

Это более кошерный вариант? Или просто один из вариантов?просто один из
Вы ж спрашивали "есть ли еще способы" :)


по сабжу - поставьте точку останова внутри ReceiveServerData и гляньте что туда пришло
...
Рейтинг: 0 / 0
25.03.2013, 13:09
    #38197221
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
ПаганельRemпропущено...


Это более кошерный вариант? Или просто один из вариантов?просто один из
Вы ж спрашивали "есть ли еще способы" :)


по сабжу - поставьте точку останова внутри ReceiveServerData и гляньте что туда пришло

Всё как надо входит и выходит. Только вот данные в ListView не обновляются.
При этом та же самая манипуляция с LinqDataSource в TextChanged приводит к желаемому результату.
Да, попробовал и DataBind() прописать - не помогло.
...
Рейтинг: 0 / 0
25.03.2013, 13:15
    #38197228
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
RemВсё как надо входит и выходит. Только вот данные в ListView не обновляютсяза обновление отвечает эта строчка?Rem
Код: javascript
1.
document.getElementById("WarnSpan").innerHTML = rValue;

тогда попробуйте локализировать проблему
например, проверьте, находится ли элемент по его id
или попробуйте поменять rValue на какое-нибудь простое значение типа <b>test</b> и посмотреть что получится...
...
Рейтинг: 0 / 0
25.03.2013, 13:57
    #38197288
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
ПаганельRemВсё как надо входит и выходит. Только вот данные в ListView не обновляютсяза обновление отвечает эта строчка?Rem
Код: javascript
1.
document.getElementById("WarnSpan").innerHTML = rValue;

тогда попробуйте локализировать проблему
например, проверьте, находится ли элемент по его id
или попробуйте поменять rValue на какое-нибудь простое значение типа <b>test</b> и посмотреть что получится...

Нет, эта строчка просто информационно-отдладочная.
DataSource для ListView является LinqDataSource. В серверном методе прописано изменение Where для моего LinqDataSource.
При использовании серверного вызова TextChanged выполняется просто
LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + TextBox1.Text + "\")";

Примерно то же самое делается в методе RaiseCallbackEvent, который дергается клиентом:
LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + eventArgument + "\")";

Первый вариант работает. При этом не надо передергивать ни сам LinqDataSource, ни ListView, ни UpdatePanel. UpdatePanel и так "понимает", что в дочернем элементе произошли изменения.
Во втором случае надо получить новый набор данных и как-то сказать серверу, чтобы он обновил для клиента ListView. Это я и пытаюсь делать путем вызова UpdatePanel1.Update()

Похоже, что-то совсем простое я делаю не так...
...
Рейтинг: 0 / 0
25.03.2013, 14:04
    #38197293
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
1) RemПаганельза обновление отвечает эта строчка?Нет, эта строчка просто информационно-отдладочнаяа где же клиентский код, который должен обновлять чаcть страницы?

2) покажите пример, что Вам приходит внутри rValue
...
Рейтинг: 0 / 0
25.03.2013, 14:05
    #38197296
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
И еще.
И в случае с первым вариантом ListView или LinqDataSource работает как-то криво. Т.е. после изменения Where в TextChanged ListView отображает вполне корректные данные, но при попытке навигации по ListView я возвращаюсь к исходному набору данных.
Т.е. получили 1000 ивановых, отобразились первые, скажем, 20 и n страниц. Тыкаю в любую страницу и получаю не ивановых, а полный список как будто никакого условия нет.
...
Рейтинг: 0 / 0
25.03.2013, 14:11
    #38197305
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Паганель1) Remпропущено...
Нет, эта строчка просто информационно-отдладочнаяа где же клиентский код, который должен обновлять чаcть страницы?

2) покажите пример, что Вам приходит внутри rValue

Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надо.
UpdatePanel просто должна знать, что ей надо обновиться. Либо от дочернего контрола, либо по триггеру, либо вызвав обновление программно.

Внутри rValue приходит строка, которая благополучно отображается в spane-е.

Вариант с развесистым клиентским и серверным кодом я уже попробовал - с ним проблем никаких. Теперь хочу то же самое сделать с использованием ajax-компонентов asp.net
...
Рейтинг: 0 / 0
25.03.2013, 14:18
    #38197317
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
RemПаганельа где же клиентский код, который должен обновлять чаcть страницы?Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надоесли код пишете не Вы, то это еще не значит, что код не существует
найдите его firebug-ом например
...
Рейтинг: 0 / 0
25.03.2013, 15:41
    #38197442
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
ПаганельRemпропущено...
Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надоесли код пишете не Вы, то это еще не значит, что код не существует
найдите его firebug-ом например

Я это понимаю. Просто в контексте Вашего вопроса речь шла о результате, который принял клиентский скрипт, написанный мной. А он как раз, кроме вызова серверного метода ничего и не делает.

Посмотрел... сервер отдал в клиентский html несколько hidden-полей, в одном из которых, видимо, данные + еще javascript-ы с кучей кода, которые, как я понимаю, занимаются отрисовкой результата.
Как посмотреть, что конкретно содержится в hidden-поле я не знаю.
...
Рейтинг: 0 / 0
25.03.2013, 16:28
    #38197549
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
берем firebug
ищем dopostback
ставим точку останова
смотрим - с какими параметрами она вызывается при обновлении updatepanel
пишем свой код, вызывающий ее с теми же параметрами
вешаем этот код в качестве обработчика на изменение текста
...
Рейтинг: 0 / 0
25.03.2013, 17:12
    #38197656
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Паганельберем firebug
ищем dopostback
ставим точку останова
смотрим - с какими параметрами она вызывается при обновлении updatepanel
пишем свой код, вызывающий ее с теми же параметрами
вешаем этот код в качестве обработчика на изменение текста

dopostback в клиентском сценарии вовсе не вызывается на событии изменения текста
Ладно, спасибо, покапаюсь в примере на msdn.
...
Рейтинг: 0 / 0
25.03.2013, 17:16
    #38197666
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
Remdopostback в клиентском сценарии вовсе не вызывается на событии изменения текстану да, говорю же руками доделайте

а на других событиях?
попробуйте кнопку внутрь панели вставить и посмотреть как dopostback тогда вызывается
...
Рейтинг: 0 / 0
25.03.2013, 17:33
    #38197713
Rem
Rem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
ПаганельRemdopostback в клиентском сценарии вовсе не вызывается на событии изменения текстану да, говорю же руками доделайте

а на других событиях?
попробуйте кнопку внутрь панели вставить и посмотреть как dopostback тогда вызывается

По всей видимости, проблема связана с тем, что на одной странице одновременно обратный вызов реализуется, как программно (на ввод в TextBox) так и декларативно в виде компонентов ScriptManager и UpdatePanel, которые сами разруливают внешний вид контролов в зависимости от событий.
Собственно говоря, я ведь от сервера и для первого случая получаю ответ, а тут задача состоит в том, чтобы еще пнуть UpadePanel со своим умом и в "параллельной реальности" :-).
Или слать post принудительно в клиентском сценарии после ввода символа в TextBox.
...
Рейтинг: 0 / 0
26.03.2013, 02:20
    #38198108
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение where в LINQ
думал я думал что ответить
так и не придумал

а давайте так
когда Вы последуете моим рекомендациям - отпишитесь о результате, ок?
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Изменение where в LINQ / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]