powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Конструктор на клиенте
23 сообщений из 23, страница 1 из 1
Конструктор на клиенте
    #37779714
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.
Последнее время частенько юзаю веб методы на страницах, чтобы подтягивать асинхронно данные, типа:
Тестовая .aspx страница и вспомогательный класс
Код: 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.
36.
namespace Example1
{
    public partial class About : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        [WebMethod]
        public static Test Test(string name, int age)
        {
            return new Test(name, age);
        }
    }
 
    public class Test
    {
        public string name { get; set; }
        public int age { get; set; }

        #region ctors

        public Test()
        {
            name = "";
            age = null;
        }

        public Test(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
        #endregion
    }
}

Также удобно (было-бы) использовать вспомогательные классы, как в примере (см. выше) класс Test .
Проблема в том, что когда я создаю класс на клиенте, то я не получаю полноценного экземпляра объекта класса, согласно вызванного конструктора.
Мало того - он спокойно хавает все, что ему запихнут в параметры:
конструирование на клиенте
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
var test1 = new Example1.Test() 
//result (test1): {__type: "Example1.Test"}

var test2 = new Example1.Test({ name: 'Вася', age: 12 }) 
//result (test2):  {__type: "Example1.Test", name: 'Вася', age: 12}

var test3 = new Example1.Test({ name: 'Вася', age: 12, langs: ['rus', 'pol'] }) 
//result (test3): {__type: "Example1.Test", name: 'Вася', age: 12, langs: ['rus', 'pol']}

В последнем варианте, это вообще не прокатывает, так как вызовет ошибку приведения типов в кодбихайнд, если я задумаю отправить этот объект на сервер, поскольку свойства langs у класса Test в помине нет, а среда таки аккуратно прописала тип: __type: "Example1.Test" .

Ну, и, наконец, вопрос: мож че я не знаю/забыл. Типа: какой-нить атрибут к классу Test нужно приклеить, а?

Перевернув мир - оглянись, может перевернулся ты сам?!
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37779999
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С утра перечитал - немного сумбурно и пример не очень, рихтую:
проверочный метод продемонстрировать лучше так:
C#
Код: c#
1.
2.
3.
4.
5.
[WebMethod]
public static string ExecTest(Test test) // т.е. передавать в метод объект, в данном случае экземпляр Test
{
     return string.Format("Привет, {0}, тебе {1} лет.", test.name, test.age);
}

javascript
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// вот здесь должен был-бы (по уму) получится такой объект:
// {__type: "Example1.Test", name: '', age: null} - по "пустому" конструктору 
var test1 = new Example1.Test()
test1.name = 'Василий'
test1.age = 18


// AJAX вызов, напр. к-либо кнопкой
PageMethods.ExecTest(test1, function(data)//отпр. test1 и колбеком показываем результат
{
     alert(data) // Привет, Василий, тебе 18 лет.
})


На "богатом" клиенте удобно работать объектами и отсылать вновь созданные, которые могут быть достаточно сложные. В текущем состоянии объект приходится лепить полностью, с долей вероятности "занесения" в него чей-то не того :)
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780055
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst,
Что Вам не понятно, конкретно???
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780118
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиiConst,
Что Вам не понятно, конкретно???Немного не так: есть-ли возможность заставить среду выполнять конструктор на клиенте.
Коли имеется проекция серверного кода (веб-метода и вспомогательного класса) на клиент, то логично предположить, что должны выполняться и конструкторы, по крайней мере дефолтный.
Возможно, такое поведение к классу по умолчанию не применяется. Многие фишки не лежат на поверхности.

А вопрос такой: кто знает, есть-ли способ заставить среду это делать?

Но, наверное, я слишком многого хочу .
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780162
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst, конструкция new Example1.Test() не подразумевает выполнения сервеного кода, как ты уже понял. То есть надо писать веб-метод(ы) для создания таких объектов с помощью серверного кода или использовать Script# .
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780167
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst,

Растолкуйте поподробней, что такое конструктор на клиенте,
зы, объект на клиенте, и объект на сервере, это две разные вещи, как колбаса и паровоз. ( только что продолговатые)
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780308
Starlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstНемного не так: есть-ли возможность заставить среду выполнять конструктор на клиенте.


Насколько я понял, вам нужно передать объект, созданный на клиенте, на сервер. Вот неплохая статья Mapping XML to Objects

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;

public class Point {
  [XmlAttribute]
  public double x;
  [XmlAttribute] 
  public double y;
}
[WebService(Namespace="urn:geometry")]
public class Geometry {
  [WebMethod]
  [SoapDocumentMethod(RequestElementName="CalcDistance",
     ResponseElementName="CalculatedDistance")]
  [return: XmlElement("result")]
  public double Distance(
    [XmlElement("o")]Point orig, [XmlElement("d")]Point dest) {
    return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +
                     Math.Pow(orig.y-dest.y, 2));
  }
}
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780321
Starlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиiConst,
Растолкуйте поподробней, что такое конструктор на клиенте,


var o = new Object(1);
конструктор объекта-числа :)
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780351
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstНемного не так: есть-ли возможность заставить среду выполнять конструктор на клиенте.Не корректно выразился, надо как-то так: есть ли возможность указать среде создать функцию Test с конструктором по умолчанию .
См. 12499264 , спойлер javascript .

Мужики, без обид, вы не в ту степь...

ASP.Net автоматом создает клиентский объект/неймспейс, называйте как хотите, в данном случае Example1 . Если я буду создавать на сервере классы типа Test, User, ХренЛысый и т.п., то у меня появятся:
Example1.Test
Example1.User
Example1.ХренЛысый (кириллицу не проверял :) ) и т.п..

При чем это функции, создающие экземпляр (клиентскую проекцию) соответствующего серверного класса, на что указывает свойство __type . По нему серверный код веб-метода и приводит клиентский объект к типу серверного объекта.

Если и сейчас не понятно - то, увы...
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780358
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Starlex,
дак как вы привяжете тип обьект клиента, к типу серверному.
зы на клиенте это просто словарь.
или делать обертку. или работать как со словарем
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780375
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Starlex,

Мой последний пост Вас не включал. :) Хотя, поясняю, проблем с передачей объектов нет. Гоняю туда-сюда как котят. Проблема с валидацией экземпляра на клиенте. Как я показал в первом примере, могу создать любой экземпляр Test, в том числе и не валидный. И нет конструктора по умолчанию.
Если такое вообще не заложено в реализацию этой части ASP.Net, то очень жаль - серьезное упущение...
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780456
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблем с передачей объектов нет. Гоняю туда-сюда как котят.
Вы гоняете просто строку JSON, а не какой обьект, применительно, к типу сервера, или клиента.
Проблема с валидацией экземпляра на клиенте. Как я показал в первом примере, могу создать любой экземпляр Test,
Вы можете создать словарь ключ = значение
, он вообще никак не соотносится к серверному типу, там может лежать, куча хлама всякого.


И нет конструктора по умолчанию.

какой вы хотите увидеть у словаря конструктор по умолчанию, такой как на сервере, так это не тип сервера, а просто словарь.
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780509
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Как расшифровывается JSON ? А?
Это именно объекты : клиентский и серверный. Ясен пень, что в момент передачи они сериализуются :).

А как они коррелируются, я уже показывал, и не раз.
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780525
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst,
не знание JS сыграло с вами злую шутку
тынц
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780531
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
поменяйте
var test1 = new Example1.Test()
test1.name = 'Василий'
test1.age = 18
на
var test1 = new Object()
test1.name = 'Василий'
test1.age = 18

и ничего не изменится на сервере, с данными атрибутами он будет работать валидно..
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780533
Starlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstStarlex,

Проблема с валидацией экземпляра на клиенте.

Во всяком случае, если нужно делать валидацию клиентского объекта к серверному типу, то логичней это делать на сервере. Инструменты парсинга есть, например, JavascriptSerializer
неплохой пример особенно в конце разбирается объект.
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780540
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиiConst,
не знание JS сыграло с вами злую шутку
тынц
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780579
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиГде-то в степи,
поменяйте
var test1 = new Example1.Test()
test1.name = 'Василий'
test1.age = 18
на
var test1 = new Object()
test1.name = 'Василий'
test1.age = 18

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

Разница между ними лишь в том, что в первом случае конструктор создает (в стотысячный раз повторяю) поле __type в котором описан тип класса.

И все будет прокатывать, до тех пор, пока не возникнет коллизия десереализации клиентского объекта между Namespace1.Test Namespace2.Test.
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780595
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarlexiConstStarlex,

Проблема с валидацией экземпляра на клиенте.

Во всяком случае, если нужно делать валидацию клиентского объекта к серверному типу, то логичней это делать на сервере. Инструменты парсинга есть, например, JavascriptSerializer
неплохой пример особенно в конце разбирается объект.Да, блин, это все понятно. Вопрос-то не изменился. :)

Если среда генерирует клиентскую функцию на основе серверного класса, то это тот самый класс - и зафиг его валидировать. Иначе нах вообще они (M$) заложили эту фишку?
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780683
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сервере конструктор и его перегрузки вызываются в зависимости от набора передаваемых данных. Если набор не подходит ни под одну из перегрузок, то включается странный алгоритм (раньше как-то не обращал внимания). :)

Если не найден набор данных, соответствующий конструктору, то вызывается дифолтный или пустой конструктор + втыкаются все подходящие данные. Не гуд.

А на клиенте - увы, нет. А было-бы неплохо.
Э-э-х! Придется самому писать :)...

Думаю, тема выдохлась.
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780786
Starlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstЕсли не найден набор данных, соответствующий конструктору, то вызывается дифолтный или пустой конструктор + втыкаются все подходящие данные. Не гуд.


Вы что-то путаете. Если не найден конструктор, соответствующий набору данных, то будет ошибка компиляции.
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780836
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Starlex,

Ничуть. Не забывайте, что идет речь об автоматической десереализации входных данных веб службы. Как там это реализовано - х.з., да и неинтересно.
...
Рейтинг: 0 / 0
Конструктор на клиенте
    #37780922
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst,
О какой коллизии выговорите.
У вас параметр метода ипизирован, и
этот код будет прокатывать
var test1 = new Object()
test1.name = 'Василий'
test1.age = 18
с созданием конструктора с параметрами.( если есть они в JSON)
если конечно там бы стоял просто обезличенный тип object, то десериализтор бы растерялся и сделал словарь по подобию jSON
зы
проверка на валидность в занесении в словарь данных ( создание обьекта) на клиенте, это слой выше
мы говорим об отправке данных на сервер.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Конструктор на клиенте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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