Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
 Аватар для pro100saniok
42 / 42 / 3
Регистрация: 11.04.2010
Сообщений: 177

Simple Membership Provider MVC 4/ Нужна документация

01.04.2013, 11:01. Показов 7475. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я создал новой проект Internet Application ASP.NET MVC 4. не могу найти любую *хорошаю документацию* о том, как сделать роли и аутентификацию.
После поиска в течение некоторого время, чтобы выучить новый MVC 4, роли и аутентификации, я нашел пару статей, по поводу этого:
Что то нашел на стек оверфлов http://stackoverflow.com/quest... plemembers.
В блоге обзор статей по аутентификации MVC 4
http://geekswithblogs.net/Alig... ation.aspx

Побывал также реализовать как сказано в этом блоге http://trixtofix.wordpress.com... der-mvc-4/

Заменил в InitializeSimpleMembershipAttribute

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
 ( using (var context = new UsersContext())
{
if (!context.Database.Exists())
{
// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
}
})


на это ну как было указано в статье

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
 ( using (var context = new UsersContext())
{
if (!context.UserProfiles.Any())
{
WebSecurityExt.InitializeRols();
WebSecurity.CreateUserAndAccount(“Admin”, “!Passw0rd”);
WebSecurityExt.AddUserToRoles(“Admin”, new string[] { “Admin” });
}
})


Я добавил в папку Models четыре уже готовых файла с этого блога

accountcontext.cs
Кликните здесь для просмотра всего текста
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
namespace Mvc_Museum_Stel.Models
{
    public class AccountContext : DbContext
    {
        static AccountContext()
        {
            Database.SetInitializer<AccountContext>(null);
        }
 
        public AccountContext()
            : base("DefaultConnection") {}
 
        public DbSet<UserProfile> UserProfiles { get; set; }
        public DbSet<Membership> Membership { get; set; }
        public DbSet<Role> Roles { get; set; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<UserProfile>()
                .HasMany<Role>(r => r.Roles)
                .WithMany(u => u.UserProfiles)
                .Map(m =>
                {
                    m.ToTable("webpages_UsersInRoles");
                    m.MapLeftKey("UserId");
                    m.MapRightKey("RoleId");
                });
        }
 
        public List<UserModel> GetAllUsers()
        {
            return UserProfiles
                .Join(Membership,
                u => u.UserId,
                um => um.UserId,
                (u, um) => new UserModel()
                {
                    UserId = u.UserId,
                    UserName = u.UserName,
                    CreateDate = um.CreateDate,
                    LastPasswordFailureDate = um.LastPasswordFailureDate,
                    PasswordChangedDate = um.PasswordChangedDate,
                    PasswordFailuresSinceLastSuccess = um.PasswordFailuresSinceLastSuccess
                }).OrderBy(q => q.UserName).ToList();
        }
 
        public UserModel GetAllUsers(int id)
        {
            return UserProfiles.Where(u => u.UserId == id)
                    .Join(Membership,
                    u => u.UserId,
                    um => um.UserId,
                    (u, um) => new UserModel()
                    {
                        UserId = u.UserId,
                        UserName = u.UserName,
                        CreateDate = um.CreateDate,
                        LastPasswordFailureDate = um.LastPasswordFailureDate,
                        PasswordChangedDate = um.PasswordChangedDate,
                        PasswordFailuresSinceLastSuccess = um.PasswordFailuresSinceLastSuccess,
                        Roles = u.Roles.Select(r => new RoleModel() { RoleId = r.RoleId, RoleName = r.RoleName })
                    }).FirstOrDefault();
        }
 
        public List<RoleModel> GetAllRoles()
        {
            return Roles.Select(r => new RoleModel()
            {
                RoleId = r.RoleId,
                RoleName = r.RoleName
            }).ToList();
        }
 
        public void AddRoles(string[] roleNames)
        {
            foreach (var roleName in roleNames)
            {
                Roles.Add(new Role() { RoleName = roleName });
            }
            SaveChanges();
        }
 
        public void AddUserToRoles(string userName, string[] roles)
        {
            var user = UserProfiles.First(u => u.UserName == userName);
            if (roles.Length > 0)
            {
                var selectedRoles = Roles.ToList().Where(r => roles.Contains(r.RoleName));
                foreach (var selectedRole in selectedRoles)
                {
                    user.Roles.Add(selectedRole);
                }
            }
            SaveChanges();
        }
 
        public void DeleteUser(int id)
        {
            var user = UserProfiles.First(u => u.UserId == id);
            //My rules for remove a user
            if (user.UserName.ToLower() != "apps" && user.UserName.ToLower() != "admin")
            {
                var memberships = Membership.Where(u => u.UserId == id);
                foreach (var membership in memberships)
                {
                    Membership.Remove(membership);
                }
 
                user.Roles.Clear();
                UserProfiles.Remove(user);
                SaveChanges();
            }
        }
 
        public void UpdateUserRoles(int userId, string[] roles)
        {
            var user = UserProfiles.First(u => u.UserId == userId);
            //My rules for update a user
            if (user.UserName.ToLower() == "apps")
                roles = new string[] { "Mobile" };
            if (user.UserName.ToLower() == "admin")
                roles = new string[] { "Admin" };
            
            user.Roles.Clear();
            if (roles.Length > 0)
            {
                var selectedRoles = Roles.ToList().Where(r => roles.Contains(r.RoleName));
                foreach (var selectedRole in selectedRoles)
                {
                    user.Roles.Add(selectedRole);
                }
            }
            SaveChanges();
        }
 
        public bool IsInRole(string user, string[] roles)
        {
            var userProfile = UserProfiles.FirstOrDefault(u => u.UserName.Equals(user));
            if (userProfile != null)
                return userProfile.Roles.Any(r => roles.Contains(r.RoleName));
            return false;
        }
 
        public void InitializeRols()
        {
            if (Roles.Count() == 0)
            {
                //My roles
                foreach (var roleName in new string[] { "Admin", "Support", "Mobile", "External" })
                {
                    Roles.Add(new Role() { RoleName = roleName });
                }
                SaveChanges();
            }
        }
    }
 
    [Table("webpages_Membership")]
    public class Membership
    {
        [Key]
        public int UserId { get; set; }
        public DateTime? CreateDate { get; set; }
        public DateTime? LastPasswordFailureDate { get; set; }
        public DateTime? PasswordChangedDate { get; set; }
        public int PasswordFailuresSinceLastSuccess { get; set; }
    }
    
 
    [Table("webpages_Roles")]
    public class Role
    {
        [Key]
        public int RoleId { get; set; }
        public string RoleName { get; set; }
        public virtual ICollection<UserProfile> UserProfiles { get; set; }
    }
}


rolemodel.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
namespace Mvc_Museum_Stel.Models
{
    public class RoleModel
    {
        public int RoleId { get; set; }
        [Display(Name = "Role name")]
        public string RoleName { get; set; }
    }
}


usermodel.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace Mvc_Museum_Stel.Models
{
    public class UserModel
    {
        public int UserId { get; set; }
        [Display(Name = "User name")]
        public string UserName { get; set; }
        [Display(Name = "Create date")]
        public DateTime? CreateDate { get; set; }
        [Display(Name = "Password changed date")]
        public DateTime? PasswordChangedDate { get; set; }
        [Display(Name = "Password failure date")]
        public DateTime? LastPasswordFailureDate { get; set; }
        [Display(Name = "Password failures")]
        public int PasswordFailuresSinceLastSuccess { get; set; }
        public IEnumerable<RoleModel> Roles { get; set; }
    }
}


websecurityext.cs
Кликните здесь для просмотра всего текста
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
namespace Mvc_Museum_Stel.Models
{
    public static class WebSecurityExt 
    {
        public static IEnumerable<RoleModel> GetAllRoles()
        {
            using (var context = new AccountContext())
            {
                return context.GetAllRoles();
            }
        }
 
        public static void AddUserToRoles(string userName, string[] roles)
        {
            using (var context = new AccountContext())
            {
                context.AddUserToRoles(userName, roles);
            }
        }
 
        public static IEnumerable<UserModel> GetAllUsers()
        {
            using (var context = new AccountContext())
            {
                return context.GetAllUsers();
            }
        }
 
        public static void DeleteUser(int id)
        {
            using (var context = new AccountContext())
            {
                context.DeleteUser(id);
            }
        }
 
        public static UserModel GetUser(int id)
        {
            using (var context = new AccountContext())
            {
                return context.GetAllUsers(id);
            }
        }
 
 
        public static void UpdateUserRoles(int userId, string[] roles)
        {
            using (var context = new AccountContext())
            {
                context.UpdateUserRoles(userId, roles);
            }
        }
 
        public static bool IsInRole(string user, string[] roles)
        {
            using (var context = new AccountContext())
            {
                return context.IsInRole(user, roles);
            }
        }
 
        public static void InitializeRols()
        {
            using (var context = new AccountContext())
            {
                context.InitializeRols();
            }
        }
    }  
}


У меня возникла проблема с этой реализаций, ('Mvc.Models.UserProfile "не содержит определения "Roles" и "Roles" нет метода расширения принимать первый аргумент "Mvc.Models.UserProfile" типа может быть найдено (вы пропали без вести использования директивы или ссылка на сборку?))

А как насчет администрирования веб-узла через WSAT?

Ну короче побывал разными методамы, и нечего не получается, кто то сталковался с таким проблемами?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.04.2013, 11:01
Ответы с готовыми решениями:

Simple Membership Provider
Есть ли какие-нибудь быстрые методы переопределенния Simple Membership Provider, чтобы при регистрации в базу заносились не только имя и...

Создание Membership Provider
Всем привет! делаю Membership по руководству товарища А: http://www.gotdotnet.ru/blogs/zhidkov/9971/ собрал код первых двух...

Свой membership provider
Добрый вечер. Пытаюсь реализовать кастомный мембершип для мвс4. Добавил в проект папку Providers С пробным классом namespace...

14
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
01.04.2013, 16:37
просто конкретно скажите, чем надо расширить Simple Membership Provider, а то не совсем понятно, какая ваша цель.
приемущество перед его предшественником, что он довльно легковесный и не надо реализовывать многие методы, которые могут не понадобиться.
т.е. он сам по себе собирается как из кубиков и расширяется. за это его и любят. единственное, что инфу мне приходилось собирать по крупицам.
1
 Аватар для pro100saniok
42 / 42 / 3
Регистрация: 11.04.2010
Сообщений: 177
01.04.2013, 23:04  [ТС]
Цитата Сообщение от kenny69 Посмотреть сообщение
просто конкретно скажите, чем надо расширить Simple Membership Provider, а то не совсем понятно, какая ваша цель.
приемущество перед его предшественником, что он довльно легковесный и не надо реализовывать многие методы, которые могут не понадобиться.
т.е. он сам по себе собирается как из кубиков и расширяется. за это его и любят. единственное, что инфу мне приходилось собирать по крупицам.
хотелось бы узнать все возможности Simple Membership Provider. а конкретно что я сейчас хочу, создать админку для сайта asp.net mvc 4 internet application, чтобы можно было просматривать профили пользователей ну и другие функции, а также Роли для сайта, чтобы пользователи с конкретными ролями могли мать доступ, только к таким функции сайта, к которым им будет открыт доступ.
ну и еще один вопрос походу,как связать мою БД с базой данных которою представляет Simple Membership Provider?
1
 Аватар для lifeact
49 / 49 / 12
Регистрация: 24.10.2012
Сообщений: 434
12.07.2013, 14:59
Цитата Сообщение от kenny69 Посмотреть сообщение
просто конкретно скажите, чем надо расширить Simple Membership Provider, а то не совсем понятно, какая ваша цель.
приемущество перед его предшественником, что он довльно легковесный и не надо реализовывать многие методы, которые могут не понадобиться.
т.е. он сам по себе собирается как из кубиков и расширяется. за это его и любят. единственное, что инфу мне приходилось собирать по крупицам.

тоже юзаю этот провайдер.
Правильно ли я хочу сделать - первому пользователю в БД - то есть себе, я ставлю роль админ, ну а дальше уже через свой сайт могу присваивать роли остальным пользователям.

и еще у меня - табла - webpages_UsersInRoles пустая. Мне нужно самому обеспечить добавление ид_юзера и роли или мембершип все это сам может?

То есть стоит вопрос организации ролей.

Буду благодарен за ссылки.
0
180 / 58 / 7
Регистрация: 28.08.2012
Сообщений: 363
12.07.2013, 18:01
lifeact, можно либо в самой бд изменять данные для таблицы ролей , либо можно сделать что-то типа админки - выводить на страницу пользователей и их роли и изменять. В этом случае вы смотрите роль пользователя - если admin, открываете доступ, если нет - сообщение об ошибке.

Про SimpleMembershipProvider и авторизацию в mvc 4 можно почитать тут
0
 Аватар для pro100saniok
42 / 42 / 3
Регистрация: 11.04.2010
Сообщений: 177
12.07.2013, 18:04  [ТС]
Цитата Сообщение от lifeact Посмотреть сообщение
тоже юзаю этот провайдер.
Правильно ли я хочу сделать - первому пользователю в БД - тока есть себе, я ставлю роль админ, ну а дальше уже через свой сайт могу присваивать роли остальным пользователям.
и еще у меня - табла - webpages_UsersInRoles пустая. Мне нужно самому обеспечить добавление ид_юзера и роли или мембершип все это сам может?
То есть стоит вопрос организации ролей.
Буду благодарен за ссылки.
у меня в проекте было по сути три роли, если так можно назвать: админ, авторизированный пользователь и неавторизированный, соответственно каждому из них были доступные определенные функция сайта. Делал это я следующим образом, добавил роль Админ и присвоил ее первому пользователю, чтобы доступ мал только он в контролере для нужного метода ставим атрибуты ([Authorize(Roles = "Admin")]), для авторизированного пользователя ([Authorize]), для неавторизированного оставляем пустым. Связи ролей с пользователями прописывал вручную.
Вот еще пару ссылок
http://www.mattjcowan.com/func... h-llblgen/
http://techbrij.com/custom-rol... sp-net-mvc
http://blog.spontaneouspublici... work-model
http://www.asp.net/mvc/tutoria... ore-part-7
1
 Аватар для lifeact
49 / 49 / 12
Регистрация: 24.10.2012
Сообщений: 434
24.09.2013, 10:26
Всем привет! Ребят пытаюсь добавить программно роль новому пользователю, но что то не понимаю, у меня есть модель Entity Framework, я вижу что таблица webpages_UsersInRoles есть: (скрин 1)

но почему в диаграмме модели я не вижу эту таблицу (скрин model)


и соответственно не могу вставить в эту таблицу id пользователя и id роли, которую хочу ему дать
Миниатюры
Simple Membership Provider MVC 4/ Нужна документация   Simple Membership Provider MVC 4/ Нужна документация  
0
 Аватар для lifeact
49 / 49 / 12
Регистрация: 24.10.2012
Сообщений: 434
24.09.2013, 11:48
вопрос снимается, оказалось просто:

Roles.AddUsersToRole( new[] {model.Email}, "User");


но почему все таки я не могу "руками" добавлять записи в эту таблицу?
0
 Аватар для lifeact
49 / 49 / 12
Регистрация: 24.10.2012
Сообщений: 434
25.10.2013, 09:05
Наткнулся на интересную особенность.

Я имею роль админа, авторизовался, зашел в свой личный кабинет, на весь класс кабинета стоит: [Authorize(Roles = Constants.ROLE_ADMIN)]

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


если убрать строку - [Authorize(Roles = Constants.ROLE_ADMIN)] а просто оставить - только авторизированным.... то можно сколько угодно перезапускать сайт и я буду заходить на страницу админа....

Добавлено через 13 часов 12 минут
оказывается у меня при старте не инициилизирован был Simple Membership...

решением стало - http://stackoverflow.com/quest... fore-you-c

Я вот не могу понять, разве этот же код не записн в \Filters\InitializeSimpleMembershipAttri bute.cs

то есть где то тут Global.asax.cs:

надо сделать вызов этого метода
C#
1
2
3
4
5
6
7
8
9
10
11
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
 
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
 
        }
как?
0
 Аватар для pro100saniok
42 / 42 / 3
Регистрация: 11.04.2010
Сообщений: 177
25.10.2013, 09:49  [ТС]
я разрабатывал свою бд, с помощью CodeFirst, для инициализации в Global, прописал
C#
1
2
            var context = new ChatContext();
            context.Database.Initialize(true);
1
 Аватар для lifeact
49 / 49 / 12
Регистрация: 24.10.2012
Сообщений: 434
29.11.2013, 12:05
ребят подскажите пж как принудительно вылогинить того или иного пользователя сайта?
0
 Аватар для Сергей 83
98 / 96 / 15
Регистрация: 28.03.2011
Сообщений: 565
02.12.2013, 01:26
удали куки в браузере.
1
 Аватар для lifeact
49 / 49 / 12
Регистрация: 24.10.2012
Сообщений: 434
02.12.2013, 09:02
Цитата Сообщение от Сергей 83 Посмотреть сообщение
удали куки в браузере.
как удалить понятно, а вот как удалить тому или иному пользователю.... я админ, а где то в другом городе за своей машиной сидит залогиненый клиент....
0
 Аватар для Сергей 83
98 / 96 / 15
Регистрация: 28.03.2011
Сообщений: 565
02.12.2013, 10:26
Вопрос поставлен не корректно.
Что такое логин? это наличие логин-куков в браузере у юзера. так как можно взять и удалить юзеру куки???????????????????????????????????? ???????????????????????????????????????? ??????????????????????
Если ты хочешь заблокировать юзера как админ - то так и нужно спрашивать - как заблокировать юзера?
1
 Аватар для lifeact
49 / 49 / 12
Регистрация: 24.10.2012
Сообщений: 434
02.12.2013, 11:10
Цитата Сообщение от Сергей 83 Посмотреть сообщение
Вопрос поставлен не корректно.
Что такое логин? это наличие логин-куков в браузере у юзера. так как можно взять и удалить юзеру
Если ты хочешь заблокировать юзера как админ - то так и нужно спрашивать - как заблокировать юзера?
пока практически не попробуешь не поймешь, понял, спасибо.

нет нет. речь шла именно о "logoff"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2013, 11:10
Помогаю со студенческими работами здесь

Профайл средствами Membership в MVC 3
Как можна сделать с помощью Membership профайл пользователя(Имя, Фамилия, аватар пользователя в БД..) не прибегая к созданию новой таблицы....

Simple MVC - Blog
Здравствуйте :) У меня такая проблема, нужно написать простой MVC - блог. Кто подскажет с чего лучше начать, ну а если лучше...

asp mvc 4 simple member ship ведет себя по разному на локале и на хосте
Всем привет! Для работы с БД использую строку подключения - &lt;add name=&quot;DBEntities&quot;...

Нужна документация по ISAPI.
ЛЮЮЮДИ !!! НУ дайте доки по ISAPI !!!!!

Нужна документация по IIS
Немагу насроит IIS. хателбы создат inranet.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru