Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ASP.NET Новый топик    Ответить
 Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Хочу изменить построенную визардом реализацию, чтобы при изменении значения текстбокса производился отбор записей аналогично
SELECT * FROM tClient WHERE Name1 Like @Name + '%'


<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 и прописывать что-то типа
        LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + TextBox1.Text + "\")";


Это нормальный подход?
Как в WhereParameters засунуть?
22 мар 13, 17:18    [14083731]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Where="Name1.StartsWith(@Name)"
22 мар 13, 17:38    [14083847]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Продолжаем разговор...
Сейчас для серверного 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 не происходит. Что сделал не так? Есть ли еще какие-либо более лаконичные или правильные способы?

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


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 + "\")";
    }
}
25 мар 13, 12:08    [14091398]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Rem
Как из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола?
http://api.jquery.com/jQuery.post/
25 мар 13, 12:19    [14091469]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
carrotik
Member

Откуда:
Сообщений: 1491
Rem,

.. а для ListView не надо DataBind() вызывать при апдейте?
25 мар 13, 12:28    [14091518]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
carrotik
Rem,

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


А надо?
В исходном варианте с TextChanged и без DataBind() работало.
25 мар 13, 12:32    [14091553]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Паганель
Rem
Как из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола?
http://api.jquery.com/jQuery.post/


Это более кошерный вариант? Или просто один из вариантов?
25 мар 13, 12:34    [14091563]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
carrotik
Member

Откуда:
Сообщений: 1491
Rem,

...я не уверен, поскольку с LinqDataSource не имел дело .. С обычным дейтасорсом - это обычное дело ...
25 мар 13, 12:36    [14091591]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Rem
Паганель
пропущено...
http://api.jquery.com/jQuery.post/


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


по сабжу - поставьте точку останова внутри ReceiveServerData и гляньте что туда пришло
25 мар 13, 12:40    [14091616]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Паганель
Rem
пропущено...


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


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


Всё как надо входит и выходит. Только вот данные в ListView не обновляются.
При этом та же самая манипуляция с LinqDataSource в TextChanged приводит к желаемому результату.
Да, попробовал и DataBind() прописать - не помогло.
25 мар 13, 13:09    [14091784]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Rem
Всё как надо входит и выходит. Только вот данные в ListView не обновляются
за обновление отвечает эта строчка?
Rem
document.getElementById("WarnSpan").innerHTML = rValue;
тогда попробуйте локализировать проблему
например, проверьте, находится ли элемент по его id
или попробуйте поменять rValue на какое-нибудь простое значение типа <b>test</b> и посмотреть что получится...
25 мар 13, 13:15    [14091813]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Паганель
Rem
Всё как надо входит и выходит. Только вот данные в ListView не обновляются
за обновление отвечает эта строчка?
Rem
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()

Похоже, что-то совсем простое я делаю не так...
25 мар 13, 13:57    [14092069]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
1)
Rem
Паганель
за обновление отвечает эта строчка?
Нет, эта строчка просто информационно-отдладочная
а где же клиентский код, который должен обновлять чаcть страницы?

2) покажите пример, что Вам приходит внутри rValue
25 мар 13, 14:04    [14092115]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
И еще.
И в случае с первым вариантом ListView или LinqDataSource работает как-то криво. Т.е. после изменения Where в TextChanged ListView отображает вполне корректные данные, но при попытке навигации по ListView я возвращаюсь к исходному набору данных.
Т.е. получили 1000 ивановых, отобразились первые, скажем, 20 и n страниц. Тыкаю в любую страницу и получаю не ивановых, а полный список как будто никакого условия нет.
25 мар 13, 14:05    [14092126]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Паганель
1)
Rem
пропущено...
Нет, эта строчка просто информационно-отдладочная
а где же клиентский код, который должен обновлять чаcть страницы?

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


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

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

Вариант с развесистым клиентским и серверным кодом я уже попробовал - с ним проблем никаких. Теперь хочу то же самое сделать с использованием ajax-компонентов asp.net
25 мар 13, 14:11    [14092152]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Rem
Паганель
а где же клиентский код, который должен обновлять чаcть страницы?
Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надо
если код пишете не Вы, то это еще не значит, что код не существует
найдите его firebug-ом например
25 мар 13, 14:18    [14092188]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Паганель
Rem
пропущено...
Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надо
если код пишете не Вы, то это еще не значит, что код не существует
найдите его firebug-ом например


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

Посмотрел... сервер отдал в клиентский html несколько hidden-полей, в одном из которых, видимо, данные + еще javascript-ы с кучей кода, которые, как я понимаю, занимаются отрисовкой результата.
Как посмотреть, что конкретно содержится в hidden-поле я не знаю.
25 мар 13, 15:41    [14092704]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
берем firebug
ищем dopostback
ставим точку останова
смотрим - с какими параметрами она вызывается при обновлении updatepanel
пишем свой код, вызывающий ее с теми же параметрами
вешаем этот код в качестве обработчика на изменение текста
25 мар 13, 16:28    [14093011]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Паганель
берем firebug
ищем dopostback
ставим точку останова
смотрим - с какими параметрами она вызывается при обновлении updatepanel
пишем свой код, вызывающий ее с теми же параметрами
вешаем этот код в качестве обработчика на изменение текста


dopostback в клиентском сценарии вовсе не вызывается на событии изменения текста
Ладно, спасибо, покапаюсь в примере на msdn.
25 мар 13, 17:12    [14093358]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Rem
dopostback в клиентском сценарии вовсе не вызывается на событии изменения текста
ну да, говорю же руками доделайте

а на других событиях?
попробуйте кнопку внутрь панели вставить и посмотреть как dopostback тогда вызывается
25 мар 13, 17:16    [14093387]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Rem
Member

Откуда:
Сообщений: 261
Паганель
Rem
dopostback в клиентском сценарии вовсе не вызывается на событии изменения текста
ну да, говорю же руками доделайте

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


По всей видимости, проблема связана с тем, что на одной странице одновременно обратный вызов реализуется, как программно (на ввод в TextBox) так и декларативно в виде компонентов ScriptManager и UpdatePanel, которые сами разруливают внешний вид контролов в зависимости от событий.
Собственно говоря, я ведь от сервера и для первого случая получаю ответ, а тут задача состоит в том, чтобы еще пнуть UpadePanel со своим умом и в "параллельной реальности" :-).
Или слать post принудительно в клиентском сценарии после ввода символа в TextBox.
25 мар 13, 17:33    [14093511]     Ответить | Цитировать Сообщить модератору
 Re: Изменение where в LINQ  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
думал я думал что ответить
так и не придумал

а давайте так
когда Вы последуете моим рекомендациям - отпишитесь о результате, ок?
26 мар 13, 02:20    [14094922]     Ответить | Цитировать Сообщить модератору
Все форумы / ASP.NET Ответить